Java(特别是Netbeans和JForms):检查每行2D数组中的重复项

时间:2016-11-24 10:15:19

标签: java arrays netbeans duplicates 2d

我在Netbeans的jForm / GUI中使用3行5个数字进行Lotto应用程序,我不希望每行都允许重复。要在第1行上有一个数字,在第3行上有相同的数字就可以了,但要将这些数字放在同一行上就不行了。

我能想到的唯一可行方法就是硬编码,最好是我不希望这样。

我试过了:

    boolean dup = false;
    for (int k = 0; k < num[0].length){ //loop through columns
     for (i = 0; i < num.length-1; i++) {
        for (int j = i; j < inArray.length; j++){
          if (num[k][i] == num[k][j]){
            dup = true;
            break;
          }
        }
      }
    } 

和此:

    public static boolean hasDuplicates(int [][] num) {
        for (int row = 0; row < num.length; row++) {
            int curRow = num[row];
           Set set = Sets.newHashSet(Arrays.asList(curRow));
            if (set.size() < curRow.length) {
               return true;
           }
       }
        return false;
   }

我也广泛地研究了其他编码,但我无法得到一个有效的编码。

我想要做的确切事情是:

通过文本字段获取三行Lotto的用户输入,检查每一行是否有重复,如果是重复则打印到jLabel或将jLabel留空并在没有重复的情况下运行其余代码。

我目前的代码是:

        private void playBtnActionPerformed(java.awt.event.ActionEvent evt) {                                        

    num[0][0] = Integer.parseInt(line00Tf.getText());
    num[0][1] = Integer.parseInt(line01Tf.getText());
    num[0][2] = Integer.parseInt(line02Tf.getText());
    num[0][3] = Integer.parseInt(line03Tf.getText());
    num[0][4] = Integer.parseInt(line04Tf.getText());
    num[1][0] = Integer.parseInt(line10Tf.getText());
    num[1][1] = Integer.parseInt(line11Tf.getText());
    num[1][2] = Integer.parseInt(line12Tf.getText());
    num[1][3] = Integer.parseInt(line13Tf.getText());
    num[1][4] = Integer.parseInt(line14Tf.getText());
    num[2][0] = Integer.parseInt(line20Tf.getText());
    num[2][1] = Integer.parseInt(line21Tf.getText());
    num[2][2] = Integer.parseInt(line22Tf.getText());
    num[2][3] = Integer.parseInt(line23Tf.getText());
    num[2][4] = Integer.parseInt(line24Tf.getText());

        duplicateLbl.setText("");
        LottoPhase1 p1 = new LottoPhase1();
        p1.setNum(num);
        p1.createSecret();
        secret = p1.getSecret();
        p1.computeCheckInput();
        correctL1 = p1.getCorrectL1();
        correctL2 = p1.getCorrectL2();
        correctL3 = p1.getCorrectL3();

        //prints secret to output
        System.out.println("Phase 1 Main Secret: " + Arrays.toString(secret));
        System.out.println();


        displayResults0Lbl.setText(Integer.toString(secret[0]) + ", " + Integer.toString(secret[1]) + ", " + Integer.toString(secret[2]) + ", " + Integer.toString(secret[3]) + ", " + Integer.toString(secret[4]));

        matched1NumLbl.setText(Integer.toString(correctL1));
        matched2NumLbl.setText(Integer.toString(correctL2));
        matched3NumLbl.setText(Integer.toString(correctL3));
    }

2 个答案:

答案 0 :(得分:0)

第二种方法有几处错误,例如

int curRow = num[row];

实际应该是:

int[] curRow = num[row];

此外,您似乎正在使用 Sets ,这可能来自您正在使用(Guava,Google Common等)的某些库。假设您没有使用任何库,您可以将代码更改为类似于:

public static boolean hasDuplicates(int [][] num) {
    for (int[] curRow : num) {
        Set<Integer> set = new HashSet<>();
        for (int n : curRow) {
            if (!set.add(n)) {
                return true;
            }
        }
    }
    return false;
}

如果你正在使用Java 8,那么删除第二个for循环的一种方法是使用Stream

public static boolean hasDuplicates(int [][] num) {
    for (int[] curRow : num) {
        Set<Integer> set = IntStream.of(curRow).boxed().collect(Collectors.toSet());
        if (set.size() < curRow.length) {
            return true;
        }
    }
    return false;
}

Stream的其他替代品可以在these之类的线程中找到。 使用以下输入进行测试会产生我认为您期望的结果:

int[][] testA = {{0,1,2,3,4}, {0,1,2,3,4}, {0,1,2,3,4}}; //false
int[][] testB = {{0,1,2,3,4}, {0,2,2,3,4}, {0,1,2,3,4}}; //true
int[][] testC = {{0,1,2,3,4}, {0,1,2,3,4}, {0,4,3,3,4}}; //true
int[][] testD = {{0,1,2,3,4}, {5,6,7,8,9}, {10,11,12,13,14}}; //false

答案 1 :(得分:0)

public static boolean hasDuplicates(int[][] num)
{
    boolean hasDuplicate  = false;
    // for each line in num
    for(int[] line : num)
    {
        // for every number in the row
        for(int i = 0; i < line.length && !hasDuplicate; i++)
        {
            // for every number in the row
            for(int j = 0; j < line.length; j++)
            {
                // if we are not comparing the same number
                if(i != j)
                {
                    // check for equality
                    if(line[i] == line[j])
                    {
                        hasDuplicate = true; // we have found a duplicate
                        break; // no need to keep checking; break the loop and return
                    }
                }
            }
        }
    }
    return hasDuplicate;
}