Java:在3d数组中随机播放数组元素

时间:2018-03-08 18:14:35

标签: java arrays 3d

我有一个多维数组,我用于包含问题和答案的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数组?

2 个答案:

答案 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)

将问题分解成更小的部分,并为每个银行的每一行创建一个对象,以便更好地控制您的洗牌方式。

  1. 随机播放每个银行每行的选项

  2. 在每个银行中随机播放每个银行的行(问题)

  3. 将银行洗牌了吗?

  4. 考虑以下示例:

    原始阵列就在这里。

    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;
        }
    }