如何在java中删除2D数组中的副本?

时间:2012-04-04 08:53:44

标签: java duplicates

我正在尝试通过2D阵列生成数独板:板[5] [5]。数独板应该只包含独特的元音。但是,我只是连续出现了独特的元音。对于列,它们似乎仍然有重复。我怎么想使用我到目前为止的代码生成一个没有重复的列?

这是我用于生成连续字母的代码:

String [] vowels = {"A","E","I","O","U"};
String [][] board = new String [vowels.length][5];

public Actions(){
    int rows = 5;
    for(int row = 0;row<rows;row++){
        ArrayList<String> tempVowels = new ArrayList<String>(Arrays.asList(vowels));
        int numVowPerLine = (int)Math.floor(Math.random()*4);
        for(int j = 0;j<numVowPerLine;j++){
            do{
                int pos = (int)Math.floor(Math.random()*5);
                if(board[row][pos] == null){
                    int temp = (int)Math.floor(Math.random()*tempVowels.size());
                    board[row][pos] = tempVowels.get(temp);
                    tempVowels.remove(temp);
                    break;
                }   
            }while(true);
        }

    }

致记:L7ColWinters

3 个答案:

答案 0 :(得分:2)

这与一个众所周知的问题有关,称为Rooks Problem

我可以建议一个更简单的循环吗?

编辑:阅读评论后,我发现问题需要应用于每个元音。在我看来,这更具可读性:

java.util.Random random = new Random();

boolean[] r_occupied;
boolean[] c_occupied;

for (i = 0; i < vowels.length; i++)
  {
    // Clear the 'occupied' information
    r_occupied = new boolean[5];
    c_occupied = new boolean[5];

    // we will put vowel[i] 'count' times into the 'board'
    count = random.nextInt(5);

    for (j = 0; j < count; j++)
      {
        // generate a random row
        row = random.nextInt(5);

        // if it is already occupied, select the next one
        while (r_occupied[row])
          row = (row + 1) % 5;

        // generate a random column
        col = random.nextInt(5);

        // if it is already occupied, select the next one
        while (c_occupied[col])
          col = (col + 1) % 5;

        /* put the vowel at board[row][col] */
        r_occupied[row] = true;
        c_occupied[col] = true;
        board[row][col] = vowel[i];
      }
  }

注意:它会覆盖一些元音,但这应该没问题。

答案 1 :(得分:0)

  1. 在连续添加其他元音字符之前,请检查是否存在 已经包含这个元音,并且continue你可以传递给 其他元音
  2. 您也可以通过切换为列做同样的事情 它
  3. 之前:

    board[row][pos] = tempVowels.get(temp);
    

    写下这个:

     boolean b = false;
    
        for(int j = 0;j<columnLength; j++){
            if(board[row][j] == tempVowels.get(temp))
                b= true;
    
            if(b == true)
            {
                b = false;
                continue;
            }
            board[row][pos] = tempVowels.get(temp);
        }
    

答案 2 :(得分:0)

如果第一列/第一行的内容为A并且您位于第一列/第二行,则可以使用截断数组(即String [] availableVowels = {"E","I","O","U"};)进行选择。如果您选择O,那么当您在第一列/第三行时,您可以选择String [] availableVowels = {"E","I","U"};。等