检查2D数组中的行是否为duplicates-java

时间:2017-08-13 13:14:15

标签: java arrays 2d

我试图制作一个方法,搜索数组中的行和列以获取重复项,但到目前为止我写的内容不起作用,我不知道如何从这里开始:

private boolean isOrderValid(int[][] boardNumbers){
   for (int i = 0; i < Size; i++) {
      for (int j = 0; j < Size; j++) {
         int CheckedNumber = boardNumbers[i][j];
         boardNumbers[i][j]=-1;
         for (int q = 0; q < Size; q++) {
             for (int l = 0; l < Size; l++) {
                 if (CheckedNumber==boardNumbers[q][l]){
                     return true;
                 }
         boardNumbers[i][j]=CheckedNumber;
         }
      }               
  }
  }
    return false;
 }

2 个答案:

答案 0 :(得分:0)

检测重复项的一种简单方法是使用Java Set类型,该类型旨在拒绝重复项。特别是,如果将值添加到先前已添加到集合中的集合,则Set方法add将返回false。这样您就知道自己遇到了重复的值。

因此,实现一个检查多维int数组重复的方法的简单方法是:

private static boolean arrayContainsDuplicateValues(int[][] multiArray) {
    Set<Integer> dupeChecker = new HashSet<>();
    int rows = multiArray.length;
    for (int rowIndex = 0; rowIndex < rows; ++rowIndex) {
        int columns = multiArray[rowIndex].length;
        for (int colIndex = 0; colIndex < columns; ++colIndex) {
            int value = multiArray[rowIndex][colIndex];
            if (!dupeChecker.add(value)) {
                // We've already added this vaule to the Set before, so this
                // value is a duplicate.
                System.out.println("Dupe: " + value);
                return true;
            }
        }
    }
    // All of the values from the array were added to the Set without any
    // duplicates being found.
    return false;
}

这只是迭代遍历数组的每个元素(动态检查每个维度中的元素数量),然后将每个值添加到Set<Integer>,该dupeChecker.add(value)纯粹是为了检测重复项而创建的。如果对false的调用返回true,那么我们就知道我们之前已经看过该值,并且该方法返回Size以指示该数组确实包含重复值。

请注意,此方法效率最高。例如,您现有的代码似乎假设数组的每个维度的大小为size(并且,根据上面的注释,变量名称不应以大写字母开头,因此这应该是{{ 1}})。如果数组的维度始终是已知的固定大小,那么您就不需要保留测量长度的代码(&#34;行&#34;&#34;列&#34;计数并且您可以将已知的固定大小硬编码到循环中。但是,如果效率并不重要,那么保持动态检查通常更安全,以避免在未来阵列的尺寸/形状发生变化时必须修改代码。此外,如果您事先知道数组的维度,则可以为HashSet<>()构造函数调用一个合适的初始容量,以避免强制Java调整HashSet的大小以适应实际的元素数。

哦,并删除对System.out.println的通话。我已将其保留,因此您可以看到哪个值被检测为重复值,但通常您不应在生产代码中将System.out.println调用。

答案 1 :(得分:0)

你正在使用四个循环OMG,你的程序复杂性将是n4。

这里我们可以使用非常简单和优化的方法。

    private boolean isOrderValid(int[][] boardNumbers){
           Set<Integer> tempSet = new HashSet<Integer>();
           boolean dupliacteFound = false;
           for (int i = 0; i < 10; i++) {
              for (int j = 0; j < 10; j++) {
                 int CheckedNumber = boardNumbers[i][j];
                 if(!tempSet.add(CheckedNumber)){
                     dupliacteFound = true;
                     break;
                 }
              }
           }
           return dupliacteFound;
    }