java使用Stream查询出list中重复的数据
时间: 2023-08-06 21:09:03 浏览: 89
java 查找list中重复数据实例详解
你可以使用 Java 8 中的 Stream API 来查询 List 中重复的数据。下面是一种实现方式:
```java
List<String> myList = Arrays.asList("a", "b", "c", "a", "d", "b");
List<String> duplicates = myList.stream()
.filter(i -> Collections.frequency(myList, i) > 1)
.distinct()
.collect(Collectors.toList());
```
在上面的代码中,我们首先创建了一个包含重复元素的字符串列表 `myList`。然后,我们使用 `stream()` 方法将列表转换为一个流,使用 `filter()` 方法过滤出出现次数大于一的元素,使用 `distinct()` 方法去除重复元素,最后使用 `collect()` 方法将过滤后的元素收集到一个新的列表中。
注意,上面的代码只能找到出现次数大于一的元素,并不能找到哪些元素重复出现了多次。如果你需要找到重复出现的元素和它们的出现次数,可以使用 Java 8 中的 Map 和 Stream API,下面是一种实现方式:
```java
List<String> myList = Arrays.asList("a", "b", "c", "a", "d", "b");
Map<String, Long> duplicates = myList.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.filter(e -> e.getValue() > 1)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
```
在上面的代码中,我们首先创建了一个包含重复元素的字符串列表 `myList`。然后,我们使用 `groupingBy()` 方法将列表中的元素分组,每个元素作为键,出现次数作为值。接着,我们使用 `entrySet()` 方法将 Map 中的键值对转换为一个流,使用 `filter()` 方法过滤出出现次数大于一的元素,最后使用 `toMap()` 方法将过滤后的元素收集到一个新的 Map 中,其中键是重复的元素,值是它们的出现次数。
注意,上面的代码只能找到重复出现的元素和它们的出现次数,不能找到哪些元素重复出现了多次。如果你需要找到哪些元素重复出现了多次,可以将上面的代码稍作修改,如下所示:
```java
List<String> myList = Arrays.asList("a", "b", "c", "a", "d", "b");
Map<String, List<Integer>> duplicates = IntStream.range(0, myList.size())
.boxed()
.collect(Collectors.groupingBy(myList::get,
Collectors.mapping(Function.identity(),
Collectors.toList())))
.entrySet()
.stream()
.filter(e -> e.getValue().size() > 1)
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue));
```
在上面的代码中,我们首先创建了一个包含重复元素的字符串列表 `myList`。然后,我们使用 `IntStream.range()` 方法生成一个包含列表下标的整数流,使用 `boxed()` 方法将整数流转换为一个包装类型流,接着使用 `groupingBy()` 方法将列表中的元素分组,每个元素作为键,出现的位置作为值。接着,我们使用 `entrySet()` 方法将 Map 中的键值对转换为一个流,使用 `filter()` 方法过滤出出现位置大于一的元素,最后使用 `toMap()` 方法将过滤后的元素收集到一个新的 Map 中,其中键是重复的元素,值是它们出现的位置列表。
注意,上面的代码可以找到哪些元素重复出现了多次,但不能找到每个元素重复出现的次数。如果你需要找到每个元素重复出现的次数和出现的位置列表,可以将上面的两段代码结合起来使用。
阅读全文