如何在缺少元素的数组中找到重复元素?如果迭代数组的次数不足,性能就会变慢。高效迭代数组的最佳方法是什么?或者,我们可以使用任何其他java集合对象以更少的迭代次数或更少的时间复杂度来查找重复项吗?
e7arh2l61#
这取决于任务条件,第一种方法更快,最后一种方法更慢:
Character[] chars = {'A', 'A', 'B', 'B', 'B', 'C'};
如果你想的话 filter 某些元素和获取 count 其中:
filter
count
Long countB = Arrays.stream(chars) .filter(ch -> ch.equals('B')).count(); System.out.println(countB); // 3
如果你想得到 distinct 元素:
distinct
Character[] distinct = Arrays.stream(chars) .distinct().toArray(Character[]::new); System.out.println(Arrays.toString(distinct)); // [A, B, C]
或者你可以用 HashSet :
HashSet
HashSet<Character> set = new HashSet<>(Arrays.asList(chars)); System.out.println(set); // [A, B, C]
如果你想的话 collect 副本Map:
collect
Map<Character, Long> duplicates = Arrays.stream(chars) .collect(Collectors.groupingBy(ch -> ch, Collectors.counting())); System.out.println(duplicates); // {A=2, B=3, C=1}
6yt4nkrj2#
你可以使用 HashSet 因为集合不允许重复,所以只需在元素数组上循环并将它们插入到 HashSet 使用 add() 方法。如果 add() 方法返回 false 那么该元素已经存在于集合中,并且它就在那里供您复制。这样,您只需在数组上循环一次,时间和空间的复杂度就会降低 O(n) .
add()
false
O(n)
2条答案
按热度按时间e7arh2l61#
这取决于任务条件,第一种方法更快,最后一种方法更慢:
如果你想的话
filter
某些元素和获取count
其中:如果你想得到
distinct
元素:或者你可以用
HashSet
:如果你想的话
collect
副本Map:6yt4nkrj2#
你可以使用
HashSet
因为集合不允许重复,所以只需在元素数组上循环并将它们插入到HashSet
使用add()
方法。如果add()
方法返回false
那么该元素已经存在于集合中,并且它就在那里供您复制。这样,您只需在数组上循环一次,时间和空间的复杂度就会降低O(n)
.