繁体   English   中英

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

[英]Duplicates search in array using HashSet and Brute Force

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

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

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

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

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

如果您使用的是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);

当有两倍或三倍时,您是否看到其他输出?

例如,对于此输入:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM