【问题标题】:How to create an array that holds arrays in java如何在java中创建一个包含数组的数组
【发布时间】:2020-04-04 07:15:09
【问题描述】:

我正在尝试制作一个包含多个 char 数组的 char 数组。下面是方法,当我运行它时,我收到一条错误消息“char[] 无法转换为 char”:

private MazeStatus[][] stringToMaze(String sMaze) {

    String[] splitString = sMaze.split("\n");
    char[][] array = new char[1][];

    for (int x = 0; x < splitString.length; x++) {
        array[1][x] = splitString[x].toCharArray();
    }
    return null; // TO DO
}

我怎样才能让它保持与字符相对的字符数组?

我已经在堆栈溢出中搜索了类似的问题,并找到了一个以 same title 为我的问题。答案之一是:

String[][] arrays = { array1, array2, array3, array4, array5 };

我理解上述方法,但是我不能这样做,因为我首先必须遍历字符串数组,将数组中的每个字符串转换为 char 数组,然后我只能将它添加到包含的数组中数组(如上面的答案所说,如果不使用数组初始化它,我不知道该怎么做)

【问题讨论】:

  • 你可以在创建数组的同时初始化它,char[][] array = new char[1]{'1','2'} ; or char[] [] array = new char[1] [2] ;
  • 并更改 splitString。 toCharArray() [x]
  • 如果你想要每行一行,每个单词有多个字符数组,你需要一个三维数组。但是,此时我建议使用 ArrayList,因为在声明变量时您似乎不知道每个项目需要多少个。
  • 感谢你们两个的帮助!完全忘记了 ArrayList 集合,它非常适合我的需求,所以谢谢@NomadMaker

标签: java arrays string char


【解决方案1】:

您对 Java 有很多误解。让我用行号来演示一下。

private MazeStatus[][] stringToMaze(String sMaze) {
    String[] splitString = sMaze.split("\n"); // line 1
    char[][] array = new char[1][]; // line 2

    for (int x = 0; x < splitString.length; x++) {  // line 3
        array[1][x] = splitString[x].toCharArray(); // line 4
    }
    return null; // TO DO
}

我假设您想接受输入并将其转换为 MazeStatus 的对象(您的问题似乎缺少该对象)。 排队:

1 - 你得到迷宫的每一行,由字符表示。

2 - 你声明一个 2D 字符数组,但只初始化其中一个维度。如果你注意到,你会发现数组的另一个维度仍然是未知的。

3 - 你经过迷宫的每一行。

4 - 将行 (splitString[x]) 转换为字符数组。您采用二维数组的第一个维度(尽管您的代码将此维度初始化为长度为 1)。如果您还没有发现问题,您应该知道 Java 数组是从 0 开始索引的。 Read up more on it。忽略这个错误,你进一步尝试在第二维存储一个完整的字符数组,而你还没有初始化这个维度。

那么你需要做什么:

  1. 您需要将第一个维度的长度设置为迷宫中的行数。

  2. 对于每一行(字符串),将数组的第二维初始化为该字符串的长度,然后设置字符数组[row] = splitString[x].toCharArray();

您可以在下面找到修改后的版本:

private String stringToMaze(String sMaze) {

    String[] splitString = sMaze.split("\n");
    char[][] array = new char[splitString.length][];
    for (int x = 0; x < splitString.length; x++) {
        array[x] = new char [splitString[x].length()];
        array[x] = splitString[x].toCharArray();

        for (int i = 0; i< splitString[x].length(); i++) {=
            System.out.print(array[x][i]);
        }
        System.out.println();
    }
    return null; // TO DO
}

【讨论】:

  • 感谢您写得非常好!我对二维数组比较了解,过去使用它们时我发现自己在苦苦挣扎。所以我肯定会对二维数组做更多的研究!我对修改后的版本中的某行有点困惑。你说“array[x] = new char [splitString[x].length()];”我理解,但是你写了“array[x] = splitString[x].toCharArray();”。这不只是替换之前 array[x] 中的内容吗?
  • 不,在java中,我们做了一些初始化和赋值。因此,在这里,假设 x = 2,array[2] = new char [splitString[2].length()] 告诉数组在它的第二个索引中是另一个大小为 splitString[2].length() 的数组。现在,array[2] = splitString[2].toCharArray() 将简单地在 array[2] 中分配该字符数组。如果没有上一步,array[2] 将不知道 array[2] 中字符数组的实际大小。 @ExileVoid
  • 此外,在这些情况下,我们必须使用 ArrayList(或 List of Lists)以获得更大的灵活性。修改后的解决方案将起作用,但您始终需要跟踪相应的 splitString 索引。
  • 我明白了,再次感谢您给我的解释。在我的课程中,我们从未做过任何初始化方法,因为我们并没有花太多时间在二维数组上,所以学习这种方式真的很酷!我总是倾向于使用 ArrayLists,并且我确实将它用于这个问题并且让它全部工作。我只是想知道如何使用一个简单的二维数组来更好地理解它是如何工作的。
  • 太好了,很高兴能帮上忙!此外,hackerrank 有一些简单的问题可以帮助您入门。
【解决方案2】:

这个错误是正常的。您正在尝试将 Array Object 影响为 char 原始值 array[1][x]。它们是两种不同的类型。

另外array[1][x] 也会抛出异常,因为你的数组长度是1,所以索引应该是0

我建议您改用ArrayList,因为您不知道sMaze 的大小,并且如果其中一个值是String,则array 中的char 元素无法处理它。

String[] splitString = sMaze.split("\n");
List<String> array = new ArrayList<>();

for (int x = 0; x < splitString.length; x++) {
    array.add(splitString[x]);
}

但是根据你想要做什么,你可以使用ArrayListChar

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 2013-12-23
    • 2021-11-04
    • 1970-01-01
    • 2010-12-31
    • 2019-12-28
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多