【问题标题】:Check duplicate in rows and columns 2D Array检查行和列中的重复二维数组
【发布时间】:2014-02-20 23:57:24
【问题描述】:

我将如何检查列和行的重复项并根据是否存在重复项返回真或假。例如

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

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

注意:这不能用外部方法完成

【问题讨论】:

  • 在您的第一个示例中,3-2-3 如何不是“重复”?有点不清楚你在问什么。
  • @BrianRoach 我很抱歉!第三行应该是 2-3-1,已编辑!
  • 您可以在这个(完全相同的)问题中找到答案:stackoverflow.com/questions/6122315/…

标签: java arrays multidimensional-array


【解决方案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;
}

【讨论】:

  • 这是一个不允许我使用集合或列表的程序。对不起,我应该在上面提到。
【解决方案2】:

遍历行中的每个值。对于每个值,检查并查看该值之后的任何值是否相同。如果值相同,则返回 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。如果你有一个大数据集,这会更有效。

【讨论】:

  • 对不起,我应该在上面提到我不能使用任何外部方法。不过感谢您的帮助,希望我能走这条路
  • 完成。你有没有这样做的任何指示。我理解了我只是不知道如何实现它的概念
  • @user3335070 我修正了不使用集合的答案。它与以前几乎相同,但它会针对其他值检查行中的每个值。我不相信这是最有效的,但它确实有效而且很简单。
  • 非常感谢,我无法表达我的感激之情。我从上午 11 点开始就一直在做这件事,我一直在这样一个街区。谢谢你。要获得列,我会切换它们,所以第一个 for 循环将是 for (int col = 0; col &lt; inArray[0].length; col++) 然后是里面的行?然后用 row 替换 otherCol?
  • 太棒了,非常感谢。你绝对让我免于熬夜!
【解决方案3】:

假设您创建了一个对一维数组进行操作的方法。您将问题分解为从二维数组中提取数字条到一维数组中。它的签名可能看起来像boolean containsDupes(int[] strip) { ... }

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

【讨论】:

    【解决方案4】:

    对于行,请尝试遵循这种程序:

    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。

    对列执行类似的过程,您就完成了!

    【讨论】:

    • 所以for (i = 0; i &lt; n-1; i++)for (i = 0; i &lt; inArray.length-1; i++) 然后下一个是for(int j = i; j &lt; inArray[i].length; j++)?谢谢你的帮助@h_k
    • 是的。我最初在那里有“n”,因为我开始让我的答案更加概括。我会把它扔进我的答案中。
    猜你喜欢
    • 2018-05-22
    • 2016-09-12
    • 2011-09-01
    • 2021-06-09
    • 2012-01-23
    • 2021-07-08
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多