使用HashSet和蛮力在数组中重复搜索

时间:2019-02-20 19:34:56

标签: java arrays duplicates

我只是尝试一个简单的程序来查找给定数组中的重复项。

/* Using HashSet */
int[] arrays = {1,2,4,5,4,2};
Set<Integer> hs = new HashSet<Integer>();
for(int ar:arrays)
{
    if(!hs.add(ar))
    {
        System.out.println("Dupicate is:" +ar);             
    }           
}       

/* Nested for loop */
int arraySearch[] = {2,2,3,4,5,6,7,7,7,8,10};
int m = 0; boolean flag = true;
for(int i=0; i<arraySearch.length; i++)
{
    flag=true;
    for(int j=i+1; j<arraySearch.length; j++)
    {
        if(arraySearch[i] == arraySearch[j])
        {
            m=arraySearch[i];
            flag = false;
            break;
        }
    }
    if(flag == false)
    {
        System.out.println(m);
    }   
}

两种方法都给出正确的结果,但是我面临的问题是,如果有两个数字一个接一个地重复,则两次被打印。     例如说int []数组= {1,1,2,4,5,4,2};

3 个答案:

答案 0 :(得分:1)

如果重复项不止一个,则打印多次。要使其仅在必须更改代码后才打印。 尝试这样做

Set<Integer> hs=new HashSet<Integer>();
Set<Integer> duplicate= new HashSet<Integer>();
for(int ar:arrays)
{
    if(!hs.add(ar))
    {
        duplicate.add(ar); 
    }           
}

这样可以避免重复打印。之后,可以使用循环显示集合中的元素。

答案 1 :(得分:0)

如果您使用的是Java 8或更高版本,则可以通过以下方式进行操作:

int[] arrays = {1,1,2,4,5,4,2};
List<Integer> hs = IntStream.of(arrays).boxed().collect(Collectors.toList());           
hs.stream().filter(i -> Collections.frequency(hs, i) > 1)
   .collect(Collectors.toSet()).forEach(System.out::println);

答案 2 :(得分:0)

双打或三联时,您还会看到其他输出吗?

例如,对于此输入:

int arraySearch[] = {2,2,3,4,5,6,7,7,7,8,10};

将有两次检测为7。存在两次检测是一个循环测试元素6抵靠元素7到10,而第二循环测试元素7抵靠元素8到10的结果:

first detection: {2,2,3,4,5,6,(7),(7),7,8,10};
second detection: {2,2,3,4,5,6,7,(7),(7),8,10};

如果数组按升序排列,则可以通过单个循环进行测试。对于以随机顺序排列的数组,似乎有必要对检测到哪些元素具有重复项进行跟踪。