【发布时间】:2021-01-20 17:18:36
【问题描述】:
很抱歉,如果没有很好地解释或者不是解决这个问题的正确方法,但我是编码新手,这是我在这里的第一个问题,所以放轻松。无论如何,我正在尝试制作一个琐事游戏,其中我的代码从单独的文本文件中读取问题和答案,并将它们中的每一个保存到自己的 ArrayList 中。每个问题都保存到ArrayList<String> 类型的特定索引中。现在对于我的答案,我将每个问题的特定答案保存到单独的二维字符串数组 (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% 工作,但我必须做了一些微小的事情,因为现在当它到达我的 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 (String[] row : answers.get(i))
其中 i 是参数;它来自shuffle() 的当前 i 索引,并且答案将返回 String[][] 但出现错误并且不太确定为什么?我知道发生的事情很小,就像可能使一个方法成为实例而不是静态的,但如果你能够发现我的错误,那就太好了!
附:根据我目前所学到的,使用 ArrayList 似乎是编写这个程序的一种很好且有条理的方式,但我从这里的几个问题中读到从未使用过;或者至少避免ArrayList<String[]>,我不太清楚为什么?对我来说,我相信它可以让我的对象在很多方面变得更加可变,但我可能是错的,如果我解释为什么不这样做,更好的选择对我的理解来说会很棒。此外,您可能已经看到我可能犯的任何其他错误或想法,这些错误或想法可能有缺陷、错误或只是采取的愚蠢路线,我们将不胜感激!我是自学的,所以任何事情都有帮助。谢谢
【问题讨论】:
标签: java arraylist multidimensional-array reference pass-by-reference