【问题标题】:How to find duplicate elements in an array of an array? [duplicate]如何在数组的数组中查找重复元素? [复制]
【发布时间】:2012-12-13 20:26:24
【问题描述】:

可能重复:
Java Array, Finding Duplicates

我有这个数组

int[][] array = {{1,2,3,4}, {5,6,2,8}, {9, 10, 11, 12}, {13, 14, 15, 16}};

如果这个数组中有重复的元素,我需要返回false。 例如索引 [0][1] 和 [1][2] 是相等的。我需要一种检测方法。如果解决方案只使用原语、数组和循环,那就太好了。

【问题讨论】:

  • 所以你有 64 * 64 次迭代??注意到了吗?
  • @Natix 更有可能是通往地狱的阶梯
  • @Natix 和 Tomas -- 伙计们不要取笑他,帮助他而不是阻止解决他的问题。

标签: java arrays loops


【解决方案1】:

1:将所有值添加到列表(例如 ArrayList)
2:将所有内容添加到集合中(例如 TreeSet)

比较 list.size()set.size()

如果不相等,则表示重复

【讨论】:

  • 领先我几秒钟。作为评论,为避免添加所有内容,您可以执行单个循环以将列表中的元素添加到集合中,如果 theSet.add() 返回 false,则返回 true(意思是“有重复项”)。
  • @AlexWien,这是解决问题的好方法。但是看看他的代码,你真的认为他能做到这一点。
  • 为什么还需要第 1 步,这个解决方案没有利用提前退出的优势
  • @Gamb set.add() 方法将是我投票赞成的答案。它返回 false 的第一个实例可能是停止条件。根本不需要列表。
  • 我只会将它们添加到集合中并跳过列表。 ;)
【解决方案2】:

如果你只想使用原语,你可以像这样使用 TIntHashSet

TIntHashSet set = new TintHashSet(); // like Set<Integer> but with primitives
for(int[] arr: array) for(int i: arr) if(!set.add(i)) return false;
return true;

如果由于重复值而无法添加,则 set.add 方法返回 false。

【讨论】:

  • TIntHashSet 是原语吗?我有正确的链接吗?
  • 很好,但是使用外部库的解决方案不是可行的方法,除了 100 万个条目。
  • TInHashSet 不是原语,也不是它包装的 int[],但它避免像 HashSet 那样创建 Integers 或 Entry 对象。我同意应该首先考虑一个普通的HashSet&lt;Integer&gt;
  • 感谢您的解决方案。我已经对其进行了一些修改,以免使用外部库。我将:TIntHashSet set = new TintHashSet(); 更改为:Set&lt;Integer&gt; set = new HashSet&lt;Integer&gt;();
【解决方案3】:

我认为这是一个家庭作业问题,因此没有实际的实施指南。

  1. 你只需要 2 个 for 循环,因为你有 2D 数组。

  2. 遍历数组中的所有数字并比较它们是否相等。

  3. 如果发现任何重复,则返回 false。

另一种方式

  1. 将此二维数组转换为一维数组

  2. 迭代并比较所有值

【讨论】:

  • 这不起作用。您需要选择第一个索引并将其与其他索引进行比较。然后选择然后选择第二个并再次将其相互比较,依此类推......这根本不适用于 2 个循环。
  • @user1253722 我更新了答案,这对你有帮助还是不让我知道?
【解决方案4】:

试试下面的代码

package com.rais.duplicates;

import java.util.HashSet;
import java.util.Set;

/**
 * @author Rais.Alam
 * @date Dec 14, 2012
 */
public class DetectDuplicateClient
{

    public static boolean isDuplicate(int[][] array)
    {
        boolean retVal = false;
        if (array != null && array.length > 0)
        {
            Set<Integer> temp = new HashSet<Integer>();

            outer:
            for (int[] innerArray : array)
            {
                for (int value : innerArray)
                {
                    if(!temp.add(value))
                    {
                        retVal = true;
                        break outer;
                    }

                }
            }
        }
        return retVal;
    }

    public static void main(String[] args)
    {

        int[][] array =  { { 1, 2, 3, 4 }, { 5, 6, 2, 8 }, { 9, 10, 11, 12 },{ 13, 14, 15, 16 } };

        System.out.println(isDuplicate(array));
    }

}

【讨论】:

    【解决方案5】:

    伪代码:

    1. 循环遍历所有值,将它们添加到HashSet
    2. 在每次迭代中,检查Set 是否包含该元素。如果是,请立即return false
    3. return true;

    这是另一种仅在您知道最大元素时才有效的方法

    1. 创建一个新数组,其中数组中的每个单元格都由元素索引
    2. If 数组单元格为零,递增单元格 (cell[element]++)。
    3. If 数组单元格为 1,return false;
    4. return true;

    【讨论】:

      【解决方案6】:

      我的解决方案:

      1. 二维数组元素到列表
      2. 对列表进行排序
      3. 如果 i 索引列表项 == i + 1,则签入一个 for 循环

      【讨论】:

        猜你喜欢
        • 2020-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        • 2017-08-18
        • 2021-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多