0

我正在尝试访问 Java 中的文本文件,但是,我不知道该怎么做并将其应用于 2D 数组。我以前在猪拉丁编码分配 ex 中为 String 做过:

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

它如何与二维数组一起工作?

4

2 回答 2

2

Java 没有二维数组。它只有数组。当然,如果您有一个组件类型也是数组的数组,它的行为很像 2D 数组,尽管它不是。例如,在 java 中,没有任何类型可以描述数组的数组,因此它是“矩形”的。你可以有:

char[][] x = ...;
x[0].length == 5;
x[1].length == 7;

这不是二维数组。char[][]只是一个一维数组,其组件是 char 数组。

有一些非常基本的语法糖可用:new char[10][20]简写为:“创建一个新的 char 数组数组,其中包含 10 个数组的空间。然后,对于每个插槽,执行new char[20]并将结果分配给该插槽”。

但不要让这让你感到困惑。这只是简写,仅此而已。只是:

char[][] x = new char[20][10];

char[][] x = new char[20][];
for (int i = 0; i < x.length; i++) {
  x[i] = new char[10];
}

它是相同的(事实上,即使在字节码级别)。2D 阵列不存在,因此您无需浪费脑空间并了解它们是什么。您只需要了解上述语法糖,并始终对代码进行推理,知道二维数组并不是真正的东西,它们只是数组中的数组。

请记住这一点,您可以使用已有的技能自行回答这个问题。

那,并且知道"foo".toCharArray()将字符串转换为 char 数组。就数组赋值而言,char 数组和字符串之间没有区别:

  • String[]是一个一维数组,仅允许您在其中分配类型的表达式String
  • char[][]是一个一维数组,仅允许您在其中分配类型的表达式char[]
  • String只是一个对象类型。也是如此char[]。数组是对象。
  • someStr.toCharArray()是一个类型为 的表达式char[]
于 2021-10-12T14:18:52.120 回答
0

文本文件通常按行读取到列表/数组中,String并且每行都可以转换为char[]using ,因此可以返回String::toCharArray锯齿状数组 of 。char[]

Java 还提供了方便的 NIO API 来读取Stream<String>可以转换为所需char[][]结果的文件:

public static char[][] readFile(String filename) throws IOException {
    return Files.lines(Paths.get(filename)) // Stream<String>
            .map(String::toCharArray)       // Stream<char[]>
            .toArray(char[][]::new);        // char[][] created
}
于 2021-10-13T08:32:27.080 回答