循环通过随机字母而不重复

时间:2015-02-02 01:26:07

标签: java loops random

对于我通过循环创建的每一行JRadioButtons,我发现很难确保每行都不重复字母。如果相同的字母存在于不同的行上,我不介意。

有什么想法吗?

提前致谢。

以下是相关代码:

    //loop for making flow layout for each line of random letters
    //counter for having number of the row next to each row in order of selection
    int counter = x;
    //array of booleans 
    boolean[] responses = new boolean[x];
    for(int i = 0; i < x; i++)
    {

        //new jpanel created for every row needed for the word
        JPanel jpLine = new JPanel(new FlowLayout());

        //new jlabel made with counter number for each row
        JLabel count = new JLabel(Integer.toString(counter));
        jpLine.add(count);
        counter--;
        //random number from 0-5 generated for each row
        Random number = new Random();
        int low = 0;
        int high = 5;
        int ranNumber = number.nextInt((high - low) + low);

        //buttongroup outside loop so only one button can be pressed for each row
        ButtonGroup bg = new ButtonGroup();

        //get selected button's index in any group with bg.getSelection().getActionCommand()
        final int row = i;

        ActionListener listener = new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {

                String action = e.getActionCommand();

                if (action.equals("Incorrect")) {
                    responses[row] = false;
                }
                else {
                    responses[row] = true;
                    //System.out.println("row " + row);
                    //System.out.println("btn " + action);
                }

                if(checkAnswers(responses) == true)
                {
                    correct.setText("<html><font color = 'white'>correct</font></html>");
                }

            }
        };

        //loop for making the number of letters in each row - always going to be 6 letters to choose from in each row
        for(int j = 0; j < 5; j++)
        {
            //if the random number generated for each row equals the loop
            //then new radiobutton will be created for the ith letter of the reversed
            //answer, starting from charAt 0 and going to the last character
            if(ranNumber == j)
            {
                JRadioButton answerLetter = new JRadioButton("<html><font color = 'white'>" + answerForGrid.charAt(i) + "</font></html>");

                bg.add(answerLetter);
                answerLetter.setBackground(Color.decode("#566771"));
                answerLetter.setOpaque(true);
                jpLine.add(answerLetter);

                //use setActionCommand("" + j) on each button to associate each button with its index
                answerLetter.setActionCommand("" + j);
                answerLetter.addActionListener(listener);

            }

            //ranLetter is generated randomly from the alphabet string, so random letters are
            //created for each jradiobutton
            final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            final int N = alphabet.length();

            Random letter = new Random();
            char ranLetter;

            while(true) 
            {
                ranLetter = alphabet.charAt(letter.nextInt(N));
                break;
            }

            JRadioButton k = new JRadioButton("<html><font color = 'white'>" + ranLetter + "</font></html>");

            bg.add(k);
            k.setBackground(Color.decode("#566771"));
            k.setOpaque(true);
            jpLine.add(k);
            k.setActionCommand("Incorrect");
            k.addActionListener(listener);


        }
        //add each row of letters (jpLine) to this loops jpanel
        jpCenterCenter.add(jpLine);


    }

3 个答案:

答案 0 :(得分:2)

  1. 使用您可以选择的ArrayList<Character>个字母。
  2. 根据每行的列表size()为列表生成随机索引。
  3. remove从列表中选择的字母
  4. 例如:

    // One possible way of creating your list
    // Reset your list within each "i" loop, just before the "j" loop, 
    //   or you'll never repeat letters across rows
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    ArrayList<Character> possibleLetters = new ArrayList<Character>(alphabet.length);
    for (char c : alphabet) possibleLetters.add(c);
    
    // now select randomly "without replacement"
    for (int j = 0; i < 5; j++) {
        int index = number.nextInt(possibleLetters.size());
        String letter = possibleLetters.remove(index);
    }
    

    您也可以这样做:

    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    ArrayList<Character> possibleLetters = new ArrayList<Character>(alphabet.length);
    for (char c : alphabet) possibleLetters.add(c);
    Collections.shuffle(possibleLetters); // optionally: shuffle(possibleLetters, number)
    
    for (int j = 0; i < 5; j++) {
        String letter = possibleLetters.get(j);
    }
    

    如果你这样做,你不需要每次都重置它,你每次只能shuffle

答案 1 :(得分:1)

您可以使用ListCollections.shuffle的组合来随机化可用字符列表,例如......

String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
List<String> values = new ArrayList<>(Arrays.asList(alphabet.split("")));
for (int row = 0; row < 10; row++) {

    Collections.shuffle(values);
    for (int col = 0; col < 5; col++) {
        System.out.print(values.get(col));
    }
    System.out.println("");

}

因为每个字符只出现在List一次,所以不可能得到重复,但使用Collections.shuffle负责每行的随机化过程。

当然,这取决于你被允许使用这些库;)

答案 2 :(得分:-1)

没有深入研究JRadioButtons的代码和东西,我认为随机排列就是你要锁定的东西。