我有一个多维数组,我用于包含问题和答案的Java测验应用程序(仅显示下面的代码段)。
others
在每个数组中,索引0(问题),索引1-4(选项),索引5(答案)。
它调用问题[x] [y] [z],其中x表示问题库,y表示问题数据,z表示列。
当在二维数组中时,collections.shuffle工作正常,但由于我将其扩展为3d数组,这不起作用,我不太清楚我需要改变什么。
public static String[][][] question = {
{
//question bank 1 (index 0)
{"Question 1","Option 1","Option 2","Option 3","Option 4","Option 2"},
{"Question 2","Option 1","Option 2","Option 3","Option 4","Option 3"},
},
{
//question bank 2 (index 1)
{"Question 1","Option 1","Option 2","Option 3","Option 4","Option 4"},
}
};
它不是改组,而是随机选择问题[0]数组或问题[1]数组内容。
理想情况下,我希望随机化问题的顺序,以及能够随机显示选项的显示顺序。至少对于第一部分,是否可以对collections.shuffle进行简单的调整,以适应3d数组?
答案 0 :(得分:0)
问题是,List<String[][]>
不是3d数组。它是2d数组的List。因此,当你执行Collections.shuffle(list)
时,你只是改变了2d数组的顺序,而不是它们的内容。
想象一下List作为一个房子,而String [] []作为他们的居民。 Collections.shuffle(asList)
setuid
你只是改变了房屋的秩序,但他们的居民仍然是一样的。
所以回答你的问题:
至少对于第一部分,是否可以对collections.shuffle进行简单的调整,以适应3d数组?
不,因为Collections接口仅应用于列表,队列双端等对象。不是阵列!因此Collections.shuffle将无法按照您希望的方式在数组上运行。但不要害怕!有一个函数可以使数组表现得像列表Arrays.asLists。你可以对它做一些研究,看看它是否能解决你的问题,但我强烈建议你使用类,它会更清洁,更简单! (即使你是初学者)。
为Answers创建一个类,另一个用于Questions,另一个用于QuestionBank。
您的计划将有一个QuestionBank列表,其中包含一系列问题和问题,其中包含一系列答案。
如果你是Collections.shuffle QuestionBank,你会随机化问题的顺序,如果你随机化这个问题,你会随机化他们答案的顺序。
答案 1 :(得分:0)
将问题分解成更小的部分,并为每个银行的每一行创建一个对象,以便更好地控制您的洗牌方式。
随机播放每个银行每行的选项
在每个银行中随机播放每个银行的行(问题)
将银行洗牌了吗?
考虑以下示例:
原始阵列就在这里。
private static String[][][] questionBanks =
{
{
// bank 1
{ "Question 1", "Option 1", "Option 2", "Option 3", "Option 4", "Option 2" },
{ "Question 2", "Option 1", "Option 2", "Option 3", "Option 4", "Option 3" },
},
{
// question bank 2 (index 1)
{ "Question 1", "Option 1", "Option 2", "Option 3", "Option 4", "Option 4" },
}
};
主要方法,负责对上面的数组进行洗牌,调用shuffle()
并打印结果,以便您可以看到它。
public static void main(String... args) throws Exception {
shuffle();
print();
}
迭代问题库的数组并打印每个银行的每一行。
private static void print() {
for (String[][] bank : questionBanks) {
System.out.println("==============");
for (String[] row : bank) {
System.out.println("------------");
for (String el : row) {
System.out.print(el);
System.out.print("\t");
}
System.out.println("\n");
}
}
}
此方法将通过将数组分成碎片并使用对象QuestionBankRow
来对数组进行洗牌,该对象处理对选项进行混洗并保留问题/答案的逻辑。通过创建QuestionBankRow
对象,如果必须重构一天以添加更多字段或更改逻辑,则可以获得更多控制权。如果可能,请考虑使用对象而不是String[][][]
数组来处理您的问题。
private static void shuffle() {
List<String[][]> banks = new ArrayList<>();
for (String[][] bank : questionBanks) {
List<String[]> shuffledBankRows = new ArrayList<>();
for (String[] bankRow : bank) {
shuffledBankRows.add(new QuestionBankRow(bankRow).getShuffledBankRow());
}
Collections.shuffle(shuffledBankRows);
banks.add(shuffledBankRows.toArray(new String[0][0]));
}
// if you don't want to shuffle the banks around, don't perform
// this shuffle
Collections.shuffle(banks);
questionBanks = banks.toArray(new String[0][0][0]);
}
此课程从问题库中读取String[]
行,获取并随机播放选项。 getShuffledBankRow()
方法返回一个String[]
,索引为0,将1-4作为混洗选项,将索引5作为答案。
private static class QuestionBankRow {
private static final int QUESTION_INDEX = 0;
private static final int OPTION_INDEX_START = 1;
private static final int OPTION_INDEX_END = 4;
private static final int ANSWER_INDEX = 5;
private static final int NUM_ELEMENTS_ROW = 6;
private final List<String> options;
private final String question;
private final String answer;
public QuestionBankRow(String[] rowArr) {
this.question = rowArr[QUESTION_INDEX];
this.answer = rowArr[ANSWER_INDEX];
this.options = new ArrayList<>();
for (int i = OPTION_INDEX_START; i <= OPTION_INDEX_END; i++) {
this.options.add(rowArr[i]);
}
}
public String[] getShuffledBankRow() {
List<String> shuffledOptions = new ArrayList<>(this.options);
Collections.shuffle(shuffledOptions);
String[] shuffledRow = new String[NUM_ELEMENTS_ROW];
shuffledRow[QUESTION_INDEX] = this.question;
for (int i = OPTION_INDEX_START; i <= OPTION_INDEX_END; i++) {
shuffledRow[i] = shuffledOptions.get(i - OPTION_INDEX_START);
}
shuffledRow[ANSWER_INDEX] = this.answer;
return shuffledRow;
}
}