使用 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]
.