How do I shuffle two arrays in same order in java

前端 未结 6 751
温柔的废话
温柔的废话 2021-01-12 01:40

I\'ve got two arrays of question and answers

String questions[] = {
\"Q1?\",
\"Q2?\",
\"Q3?\"};

String answers[] = {
    \"A1?\",
    \"A2?\",
    \"A3?\"}         


        
相关标签:
6条回答
  • 2021-01-12 01:50

    Create a class QuestionAndAnswer and use an array of that class.

    0 讨论(0)
  • 2021-01-12 02:03

    You can rather shuffle a new array which holds the indices. And then get the elements from both array from the first index.

    List<Integer> indexArray = Arrays.asList(0, 1, 2);
    
    Collections.shuffle(indexArray);
    
    String question = questions[indexArray.get(0)];
    String answer = answers[indexArray.get(0)];
    

    Of course, creating a class containing questions and answers would be a more OO way, as other answers suggest. That way, you would have to maintain just one List or array, as compared to 3 arrays in the current approach.

    0 讨论(0)
  • 2021-01-12 02:08

    Java Collections has a (surprisingly) simple solution to this problem: Collections.shuffle(Collection<?>, Random) with a Random seeded with same seed.

        List<Integer> quests = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> answers = Arrays.asList(10, 20, 30, 40, 50);
    
        long seed = System.nanoTime();
        Collections.shuffle(quests, new Random(seed));
        Collections.shuffle(answers, new Random(seed));
    
        System.out.println(quests);
        System.out.println(answers);
    

    Note:

    Extra optimization is dangerous. This DOE NOT WORK:

        long seed = System.nanoTime();
        Random rnd = new Random(seed);
        Collections.shuffle(quests, rnd);
        Collections.shuffle(answers, rnd);
    

    Originally posted at: https://stackoverflow.com/a/44863528/1506477

    0 讨论(0)
  • 2021-01-12 02:14

    Creating a class for holding both the question and answer together would be an easier and more OO solution:

    class QuestionAnswerPair {
        private final String question;
        private final String answer;
    
        public QuestionAnswerPair(String question, String answer) {
            this.question = question;
            this.answer = answer;
        }
    }
    

    And then:

    QuestionAnswerPair[] questions = new QuestionAnswerPair[] {
        // Put questions here
    };
    
    Collections.shuffle(Arrays.asList(questions));
    
    0 讨论(0)
  • 2021-01-12 02:16

    Instead of shuffling answers and questions, you may shuffle an extra array of integers that has indexes to questions/answers and then extract question and answers from corresponding arrays using shuffled indexes.

    0 讨论(0)
  • 2021-01-12 02:17

    Idea from: http://www.vogella.com/tutorials/JavaAlgorithmsShuffle/article.html

    public static void shuffle2ArraysTogther(String[] a, String[] b) {
        if(a.length == b.length) {
            int n = a.length;
            Random random = new Random();
            random.nextInt();
            for (int i = 0; i < n; i++) {
                int change = i + random.nextInt(n - i);
                swap(a, i, change);
                swap(b, i, change);
            }
        }
    }
    
    private static void swap(String[] a, int i, int change) {
        String helper = a[i];
        a[i] = a[change];
        a[change] = helper;
    }
    
    private static void swap(String[] a, int i, int change) {
        String helper = a[i];
        a[i] = a[change];
        a[change] = helper;
    }
    String questions[] = {
        "Q1?",
        "Q2?",
        "Q3?"
    };
    
    String answers[] = {
        "A1?",
        "A2?",
        "A3?"
    };
    shuffle2ArraysTogther(questions, answers);
    for (String i : questions) {
        System.out.println(i);
    }
    for (String i : answers) {
        System.out.println(i);
    }
    
    0 讨论(0)
提交回复
热议问题