#java #arrays
Вопрос:
Я пытаюсь получить доступ к текстовым файлам на Java, однако я не знаю, как это сделать и применить его к 2D-массиву. Я делал это раньше для строки в поросячьем латинском кодировании assignminet e.x :
public static void piglatenizeFile(Scanner infile, String filename) throws IOException{ PrintWriter outFile = new PrintWriter(filename); while(infile.hasNext()){ String s = infile.nextLine(); String p = pig(s); outFile.println(p); } outFile.close(); }
Однако это то, что я должен сделать:
/* creates scanner for filename creates 2D array based on row/col and characters in file */ public static char[][] read(String filename) throws FileNotFoundException{ }
Как это работает с 2D-массивом?
Ответ №1:
В Java нет 2D-массивов. В нем просто есть массивы. Конечно, если у вас есть массив, тип компонента которого также является массивом, он действует во многом как 2D-массив, даже если это не так. Например, в java нет типа, описывающего массив массивов таким образом, чтобы он был «прямоугольным». Вы можете иметь:
char[][] x = ...; x[0].length == 5; x[1].length == 7;
Который не является 2D-массивом. char[][]
это всего лишь 1D массив, компонентами которого являются массивы символов.
Существует очень простой синтаксический сахар: new char[10][20]
это сокращение для: «Создайте новый массив массивов символов с местом для 10 массивов. Затем для каждого слота выполните new char[20]
и назначьте результат этому слоту».
Но пусть это вас не смущает. Это просто стенография, вот и все. Это просто:
char[][] x = new char[20][10];
и
char[][] x = new char[20][]; for (int i = 0; i lt; x.length; i ) { x[i] = new char[10]; }
Он идентичен (даже на уровне байт-кода, на самом деле). 2D-массивов не существует, и поэтому вам не нужно тратить время на размышления и изучать, что это такое. Вам просто нужно знать о приведенном выше синтаксисе и всегда рассуждать о коде, зная, что 2D-массивы на самом деле не вещь, это просто массивы массивов.
Имейте это в виду, и вы сможете ответить на этот вопрос самостоятельно, используя навыки, которыми вы уже обладаете.
Это и знайте, что "foo".toCharArray()
превращает строку в массив символов. Нет никакой разницы между массивом символов и строкой в том, что касается назначений массивов:
String[]
представляет собой массив 1D, который позволяет назначатьString
в них только выражения типа.char[][]
представляет собой массив 1D, который позволяет назначатьchar[]
в них только выражения типа.String
это просто тип объекта. Так и естьchar[]
. массивы-это объекты.someStr.toCharArray()
является выражением с типомchar[]
.
Ответ №2:
Текстовые файлы обычно считываются строками в список/массив String
, и каждая строка может быть преобразована в char[]
использование String::toCharArray
, поэтому char[]
может быть возвращен неровный массив.
Java также предоставляет удобный API NIO для чтения файлов, Streamlt;Stringgt;
которые могут быть преобразованы в желаемый char[][]
результат:
public static char[][] readFile(String filename) throws IOException { return Files.lines(Paths.get(filename)) // Streamlt;Stringgt; .map(String::toCharArray) // Streamlt;char[]gt; .toArray(char[][]::new); // char[][] created }