首页 > 解决方案 > 传递 ArrayList 的特定索引但 String 实际上是一个 String[][]

问题描述

抱歉,如果没有很好地解释或者不是解决这个问题的正确方法,但我是编码新手,这是我在这里的第一个问题,所以放轻松。无论如何,我正在尝试制作一个琐事游戏,我的代码从单独的文本文件中读取问题和答案,并将它们中的每一个保存到自己的 ArrayList 中。每个问题都保存到 type 的特定索引中ArrayList<String>。现在对于我的答案,我将每个问题的特定答案保存到单独的 2D 字符串数组 ( String[1][4]) 中,以便稍后转移到自己的答案中ArrayList<String[]>. 这样,两个 ArrayList 的索引都匹配(问题与他们的答案)。我想创建自己的 shuffle 方法,这样 ArrayList 与它们之间的匹配索引保持等效。现在我的代码确实可以完美运行,然后突然决定这是一个糟糕的主意!过去几天我一直在尝试以 0 运气修复它。我的问题在于我试图打乱每一个问题的答案;这样,答案选项的顺序永远不会相同。我的代码如下:

private static void shuffle(ArrayList<String> questions,
                            ArrayList<String[]> answers) {
    int chosenIndex;
    int questionsSize = questions.size();
    for (int i = 0; i < questionsSize - 1; i++) {
        chosenIndex = (int) (Math.random() * questionsSize);
        swap(i, chosenIndex);
        for (int j = 0; j < answers.get(i).length; j++) {
            int answerIndex = (int) (Math.random() * answers.get(i).length);
            swapAnswers(i, j, answerIndex);
        }
    }
}
private static void swap(int i, int j) {
    String temp = questions.get(i);
    String[] temp2 = answers.get(i);

    questions.set(i, questions.get(j));
    answers.set(i, answers.get(j));

    questions.set(j, temp);
    answers.set(j, temp2);
}
private static void swapAnswers(int i, int j, int a) {
    for (String[] row : answers) {
        String currentColIndexCopy = row[j];
        String randomIndexToSwitch = row[a];

        row[j] = randomIndexToSwitch;
        row[a] = currentColIndexCopy;

        break;
    }
}

现在我的代码再次 100% 工作,但我必须做了一些微小的事情,因为现在当它到达我的 for each 循环时,swapAnswers()我的答案永远不会为我的答案改组正确的索引ArrayList<String[]>。我还没有注意到任何趋势。代码的工作原理是在shuffle()第一个 for 循环中对两个 ArrayList 进行洗牌,因此它们的索引对应。然后第二个 for 循环打乱了问题的答案,但是一旦我到达swapAnswers()for each 循环的答案变量与当前问题的答案不一致!(我的意思是在shuffle()我的第一次迭代中,所有答案都被洗牌,但是当我增加到下一个问题时,答案变量在swapAnswers()可能会保留在前面的问题答案上)就像我说的我还是很新的,所以也许这是某个地方的语法错误,但我已经尝试了一切,但似乎无法让这个东西再次工作!

注意:这些是类变量,问题和答案保存在

public static ArrayList<String> questions;
public static ArrayList<String[]> answers;

它们是静态的,这意味着(我认为)可以在课堂上的任何地方轻松访问它们。当我调用时,shuffle()我将这些作为参数传递,我认为这是不必要的,但这样做是为了保证安全。制作这个时我唯一不明白的是,我最初是如何将每个答案传递String[][]swapAnswers()但我让它工作的,所以我没有质疑它,直到它停止。我只是假设它知道它正在使用的当前对象。我试图让 for each 循环

for (String[] row : answers.get(i))

其中 i 是参数;它来自当前的 i 索引shuffle(),并且答案将返回 aString[][]但出现错误并且不太确定为什么?我知道发生的事情很小,就像可能使一个方法成为实例而不是静态的,但是如果您能够发现我的错误,那就太好了!

PS 从我目前所学的来看,使用 ArrayList 似乎是编写这个程序的一种很好且有条理的方式,但我从这里读到的一些问题从未使用过;或者至少避免,ArrayList<String[]>我不太清楚为什么?对我来说,我相信它可以让我的对象在很多方面变得更加可变,但我可能是错的,如果我解释为什么不这样做,更好的选择对我的理解来说会很棒。此外,您可能已经看到我可能犯的任何其他错误或想法,这些错误或想法可能是有缺陷的、错误的,或者只是采取的愚蠢路线,我们将不胜感激!我是自学的,所以任何事情都有帮助。谢谢

标签: javaarraylistmultidimensional-arrayreferencepass-by-reference

解决方案


我也是新手。我注意到你的 swapAnswers 写错了。它是如何编写的,它总是只会打乱答案的第一个索引,因为你传入int i但从不使用它。正确的方法如下。

private static void swapAnswers(int i, int j, int a) {
    String[] row = answers.get(i);
    String currentColIndexCopy = row[j];
    String randomIndexToSwitch = row[a];

    row[j] = randomIndexToSwitch;
    row[a] = currentColIndexCopy;
}

我建议不要创建两个问题和答案列表,而是创建一个名为 Card 的类,该类将包含一个字符串问题和一个列表答案。这将有助于避免此类情况,并有助于提高编码质量。然后,您可以创建函数以将其保存为两个列表格式并从两个列表格式加载它。

我还注意到你的第一个函数 shuffle where for (int i = 0; i < questionsSize - 1; i++)should be中的一个潜在错误for (int i = 0; i < questionsSize; i++)。除非您的幸运和最后一个索引被随机选择与前一个索引一起洗牌,否则您的代码永远不会洗牌最后一个索引。

您的原始代码:for (String[] row : answers.get(i))不起作用的原因是因为answers.get(i)返回一行(String[] row)不是可迭代的。

我不确定为什么人们说要避免使用ArrayList<String[]>,但这可能是因为您所经历的它会变得多么混乱。您应该始终致力于在列表中仅包含对象或基本数据类型(字符串、浮点数等)。


推荐阅读