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

Java (specifically Netbeans and JForms): Checking duplicates in each line of 2D array

我正在 Netbeans 的 jForm/GUI 中做一个 Lotto 应用程序,它有 3 行,每行 5 个数字,我不希望每行都允许重复。第 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));
    }

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

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

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

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