检查行和列2D Array中的重复项

时间:2014-02-20 23:57:25

标签: java arrays multidimensional-array

我将如何检查列和行的副本并返回true或false,具体取决于是否存在重复项。例如

1 2 3

3 1 2

2 3 1

将返回true,因为没有重复项,但是..

1 2 2

3 2 3

2 1 1

将返回false,因为第2列{2,2,1}中存在重复。

我如何检查行中是否有重复项,然后检查列中是否有重复项?

到目前为止,我只有以下内容:

public static boolean hasDuplicates(int [][] inArray)
{
   for (int row = 0; row < inArray.length; row++)
   {
      int rowCheck = inArray[row][inArray.length];
      for (int col = 0; col < inArray[row].length; col++)
      {

      }
   }
   return false;
}

所以我需要接受一个数组并检查列或行之间是否有任何重复。有什么指针吗?谢谢!

注意:使用外部方法无法做到这一点

4 个答案:

答案 0 :(得分:1)

对于行,请尝试遵循以下过程:

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

所以,你从第一个元素开始,然后从元素2扫描到n(即列数)。如果找到匹配项,那么您将布尔值设置为true。如果不匹配,则i递增,内部for循环从元素3扫描到n。

对列进行类似的操作,您就完成了!

答案 1 :(得分:1)

浏览行中的每个值。对于每个值,请检查并查看该值之后的任何值是否相同。如果值相同,则返回true(您发现重复)。如果这些值都不相同,请递增索引并对下一行执行相同操作。每行最多需要n(n + 1)/ 2次比较,这并不是很好。因此,如果n是列数,m是行数,则会运行,最差情况为m(n(n + 1)/ 2)次。

以下是它如何适用于行的示例:

/**
 * Return flag indicating if there are duplicates in the rows of the 2D array
 * 
 * @return true if a row has duplicates, else false
 */
public boolean hasDuplicatesInRows(int[][] inArray)
{
    for (int row = 0; row < inArray.length; row++)
    {
        for (int col = 0; col < inArray[row].length; col++)
        {
            int num = inArray[row][col];
            for (int otherCol = col + 1; otherCol < inArray.length; otherCol++)
            {
                if (num == inArray[row][otherCol])
                {
                    return true;
                }
            }
        }
    }

    return false;
}

这也很容易扩展到列。我会留下那个让你做的。

如果您使用了有效的排序方法并对所有行进行了排序,您可以直接查看该行,看看是否有任何值等于它之后的值。如果是,则返回true,否则返回false。如果您拥有大型数据集,这将更有效。

答案 2 :(得分:1)

假设您创建了一个在一维数组上运行的方法。您可以解决问题,将二维数组中的数字条带提取为一维数组。它的签名可能看起来像boolean containsDupes(int[] strip) { ... }

该方法中有几种方法可以使解决更容易。一种方法是对该数组进行排序,以使这些数据彼此相邻。另一种方法是使用每个值填充HashSet,并将Set的大小与数组的长度进行比较。

答案 3 :(得分:1)

实现此任务的一种更紧凑的方法是将所有值添加到Set中,然后使用guava将Set中的唯一元素数与原始行大小进行比较。

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