您的问题
- 您正在比较
i 而不是 array[i]。
- 您正在解析
数组两次,因此每个值至少显示一次,即使
它不是重复的。
这会起作用,但它仍然会打印多次重复值:
int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13,13};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
if (array[i] == array[j] && i != j){
System.out.println(array[i]);
}
}
}
现在,我向您展示解决此问题的不同样式。
命令式风格的更好解决方案。
您正在解析数组n 次,这是无用的。如果数组已排序(无论如何都可以排序),您可以像在此解决方案中一样将一个元素与下一个元素进行比较:
int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};
//Optionally
Arrays.sort(array);
Integer last = null;
for(int i = 0; i < array.length -1 ; i++) {
if(array[i] == array[i+1] && (last == null || !last.equals(array[i]))) {
System.out.println(array[i]);
last = array[i];
}
}
我认为这是最有效的解决方案,但不是最易读的。
使用 foreach 循环的另一种解决方案
除非您明确需要访问当前元素的索引,否则使用普通的旧 for 循环是邪恶的,因为它引入了不必要的变量 i,这会污染代码的可读性。
您可以更喜欢使用 foreach 语句:
int array[] = {1,2,3,3,3,4,5,6,6,7,8,8,10,10,11,12,13,13};
Set<Integer> uniqueValues = new HashSet<>();
Set<Integer> alreadyDisplayed = new HashSet<>();
for(Integer value : array) {
if(uniqueValues.contains(value) && !alreadyDisplayed.contains(value)) {
System.out.println(value);
alreadyDisplayed.add(value);
}
uniqueValues.add(value);
}
功能风格的更好解决方案。
这个对Java8更友好的解决方案:
int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};
//Count occurrences of each number
Map<Integer, Integer> map = new HashMap<>();
Arrays.stream(array).forEach(value -> {
Integer occurrences = map.get(value);
map.put(value, occurrences == null ? 1 : occurrences +1);
});
//Display number of occurrences when nbOccurrences > 1
map.entrySet()
.stream()
.filter(entry -> entry.getValue() > 1)
.forEach(entry -> System.out.println(entry.getKey() + " : "+entry.getValue()));
请注意,它还给出了每个值的出现次数。如果您不需要它们,您可以像以前的解决方案一样缩短代码。
逻辑风格的更有趣的解决方案。
Integer array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};
//Convert the array to a list.
List<Integer> list = Arrays.stream(array).collect(Collectors.toList());
//Use a Set in order to build the collection of unique values.
Set<Integer> uniqueValues = new HashSet<>(list);
//Remove each unique value once from the original list.
uniqueValues.stream().forEach(list::remove);
//Re-compute unique values of the resulting list and display them.
new HashSet<>(list).forEach(System.out::println);