如何为我的 toString 方法将字符串数组转换为字符串

How to convert a String Array to a String for my toString method

这是我的toString方法。

public String toString() {
   Life game = new Life(grid);
   String word;
       for (int row = 0; row < grid.length; row++) {
           for (int col = 0; col < grid[0].length; col++) {
               System.out.print("[" + grid[row][col] + "]");  
           }
           System.out.println();
       }
   word = "";
   return word;
}

我正在尝试获取 ("[" + grid[row][col] + "]");进入我的 String 字。这是为了创建一个生命网格游戏,我不知道如何将数组放入字符串表示形式。

如果所有细胞都死了,它应该是什么样子的一些样本。 `

[0][0][0][0][0][0][0][0][0][0]
[0][0][0][0][0][0][0][0][0][0]
[0][0][0][0][0][0][0][0][0][0]
[0][0][0][0][0][0][0][0][0][0]
[0][0][0][0][0][0][0][0][0][0]
[0][0][0][0][0][0][0][0][0][0]
[0][0][0][0][0][0][0][0][0][0]
[0][0][0][0][0][0][0][0][0][0]
[0][0][0][0][0][0][0][0][0][0]
[0][0][0][0][0][0][0][0][0][0]

当我尝试 word = word + "[" + grid[row][col] + "]";我得到...

[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]...

全部在一条直线上。

您在这里处理两个问题:

  • 将输出收集到 String - 这可以通过 StringBuilder class 和
  • 来完成
  • 向输出字符串添加换行符 - 这在this Q&A
  • 中有解释

最终结果应如下所示:

StringBuilder res = new StringBuilder();
String newline = System.getProperty("line.separator");
for (int row = 0 ; row < grid.length ; row++) {
    for (int col = 0 ; col < grid[row].length ; col++) {
        res.append('[');
        res.append(grid[row][col]);
        res.append(']');
    }
    // Do not append the trailing newline
    if (row != grid.length-1) {
        res.append(newline);
    }
}
return res.toString();

考虑使用 Java 8 的 StringJoiner:

public String toString() {
    StringJoiner iJoiner = new StringJoiner(System.getProperty("line.separator"));

    for (int i = 0 ; i < grid.length ; i++) {
        StringJoiner jJoiner = new StringJoiner("][", "[", "]");
        for (int j = 0 ; j < grid[i].length ; j++) {
            jJoiner.add("" + grid[i][j]);
        }
        iJoiner.add(jJoiner.toString());
    }
    return iJoiner.toString();
}

StringJoiner 在元素之间(但不是之前或之后)放置分隔符,并可选择添加前缀或后缀。

source 值得一看,因为它以优雅的方式实现了这一点。

您也可以使用 Collectors.joining() 以面向流的方式执行此操作——这是一个围绕 StringJoiner:

实现的简单 Collector
 return Arrays.stream(grid)
     .map(row ->
         Arrays.stream(row)
             .mapToObj( x -> ""+x )
             .collect(Collectors.joining("][", "[", "]"))
     .collect(Collectors.joining(lineSeparator));
  • 根据输入 int[][]
  • 生成 Stream<int[]>
  • 使用 map() 处理每个 int[]
    • int[]变成IntStream
    • mapToObjIntStream 转换为 Stream<String>,行的每个单元格都有一个项目
    • Stream<String>收集到格式化行字符串"[1][2][3]"
    • map() 因此 returns 一个 Stream<String>
  • Stream<String>收集到一个换行符分隔的字符串