我只是尝试一个简单的程序来查找给定数组中的重复项。
/* 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};
答案 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};
如果数组按升序排列,则可以通过单个循环进行测试。对于以随机顺序排列的数组,似乎有必要对检测到哪些元素具有重复项进行跟踪。