Java 检查二维数组中的行和列是否重复

Java 检查二维数组中的行和列是否重复,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,如何检查列和行的重复项,并根据是否存在重复项返回true或false。比如说 123 3 1 2 2 3 1 将返回true,因为没有重复项,但是 12 3 2 3 21 将返回false,因为第2{2,2,1}列中存在重复项 如何检查行中是否有重复项,然后检查列中是否有重复项 到目前为止,我只有以下几点: public static boolean hasDuplicates(int [][] inArray) { for (int row = 0; row < inArray.l

如何检查列和行的重复项,并根据是否存在重复项返回true或false。比如说

123

3 1 2

2 3 1

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

12

3 2 3

21

将返回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;
}
公共静态布尔值hasDuplicates(int[]inArray)
{
对于(int row=0;row
因此,我需要接收一个数组,并检查列或行之间是否存在任何重复项。有什么建议吗?谢谢大家!


注意:这不能通过外部方法来完成

对于行,请尝试以下步骤:

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;
      }
    }
  }
}
boolean dup=false;
对于(int k=0;k
因此,您从第一个元素开始,然后从元素2扫描到n(即列数)。如果找到匹配项,则将布尔值设置为true。如果不匹配,则i递增,内部for循环从元素3扫描到n


对列执行类似的步骤,就完成了

检查行中的每个值。对于每个值,检查并查看该值之后的任何值是否相同。如果值相同,则返回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
*/
公共布尔值hasDuplicatesInRows(int[][]inArray)
{
对于(int row=0;row
这也很容易扩展到do列。不过我会让你去做的


如果使用有效的排序方法并对所有行进行排序,则只需沿着这一行往下看是否有任何值等于后面的值。如果是,则返回true,否则返回false。如果您有一个大的数据集,这将更加有效。

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


该方法中有两种方法可以使问题更容易解决。一种方法是对该数组进行排序,使重复项彼此相邻。另一种方法是使用每个值填充哈希集,并将该集的大小与数组的长度进行比较。

实现此任务的更简洁的方法是将所有值添加到一个集合中,然后使用番石榴将集合中唯一元素的数量与原始行大小进行比较

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;
}
公共静态布尔值hasDuplicates(int[]inArray){
对于(int row=0;row
在您的第一个示例中,3-2-3怎么不是“重复的”?有点不清楚你在问什么。@BrianRoach,我道歉!第三行应该是2-3-1,已编辑!你可以在这个(完全相同的)问题中找到你的答案:对于(i=0;i也是
对于(i=0;i
,然后下一个是
对于(int j=i;j
?谢谢你的帮助。我本来在里面有个“n”,因为我开始让我的答案更一般化。我将把它加入我的答案中。这是针对一个不允许我使用集合或列表的程序。对不起,我应该在上面提到。对不起,我应该在上面提到我不能使用任何外部方法。谢谢你的帮助,希望我能走这条路。你有没有什么方法可以在没有任何提示的情况下做这件事。我理解这个概念,但我不知道如何实现it@user3335070我修正了我的答案,不使用集合。它与以前几乎相同,但它会针对行中的每个值与其他值进行检查。我不相信这是最有效的,但它确实有效,而且很简单。非常感谢你,我无法表达我的感激之情。。我从上午11点就开始做这件事了,我一直处于这样的困境。非常感谢。要获取列,我需要将它们切换,以便第一个for循环是for(int col=0;col然后是内部的行?然后用一行代替另一行,谢谢。你真的救了我一个通宵!