使用Java 8功能,这是一种算法,可兑现列表中的重复项而不是将列表变成一组。没有排序,所以没有n log n
。
- 将列表之一转换为地图,其值是出现的次数(成本:O(n))。
- 对于其他列表中的每个项目,如果该项目存在于地图中,则将出现次数减少一个(成本:O(n))。
因此,总成本为O(n)。码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Dup {
public static void main(String[] args) {
List<Integer> listA = Arrays.asList(3, 1, 4, 1, 9, 5, 9);
List<Integer> listB = Arrays.asList(2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3);
findCommons(listA, listB);
}
static void findCommons(List<Integer> listA, List<Integer> listB) {
Map<Integer, Long> mapA =
listA.stream().collect(
Collectors.groupingBy(Integer::intValue, Collectors.counting()));
List<Integer> commons = new ArrayList<>();
listB.stream()
.filter(e -> mapA.get(e) != null)
.filter(e -> mapA.get(e) > 0)
.forEach(e -> {
mapA.put(e, mapA.get(e) - 1);
commons.add(e);
});
System.out.println(commons);
}
}
上面的代码将给出以下输出:[5, 3, 9, 9]
。