Доступ к текстовым файлам на Java

#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 }