一、List
1、法一:List 自带函数
推荐阅读:java-----求两个list的交集、并集、和差集
List list1 =new ArrayList();
list1.add("1111");
list1.add("2222");
list1.add("3333");
List list2 =new ArrayList();
list2.add("3333");
list2.add("4444");
list2.add("5555");
//并集
list1.addAll(list2);
//交集
list1.retainAll(list2);
//差集
list1.removeAll(list2);
//无重复并集
list2.removeAll(list1);
list1.addAll(list2);
慎用:
addAll
:直接修改第一个list,把第 2 个 list 中的数据添加到第一个 list 中retainAll
:直接修改第一个list,返回 boolean,若修改了第一个 list 就返回 true,没修改就返回 falseremoveAll
:直接修改第一个list,使用第一个 list 的内容去减第 2 个 list
2、法二:guava Sets 方法
将 List 转为 Set,然后通过 guava 进行操作:
public class Test04 {
public static void main(String[] args) {
Set<Integer> sets = Sets.newHashSet(1, 2, 3, 4, 5, 6);
Set<Integer> sets2 = Sets.newHashSet(3, 4, 5, 6, 7, 8, 9);
// 交集
System.out.println("交集为:");
Sets.SetView<Integer> intersection = Sets.intersection(sets, sets2);
for (Integer temp : intersection) {
System.out.print(temp + " ");
}
System.out.println();
// 差集
System.out.println("差集为:");
Sets.SetView<Integer> diff = Sets.difference(sets, sets2);
for (Integer temp : diff) {
System.out.print(temp + " ");
}
System.out.println();
// 并集
System.out.println("并集为:");
Sets.SetView<Integer> union = Sets.union(sets, sets2);
for (Integer temp : union) {
System.out.print(temp + " ");
}
}
}
//结果:
交集为:
3 4 5 6
差集为:
1 2
并集为:
1 2 3 4 5 6 7 8 9
二、Map
- 推荐阅读:guava 的集合工具类
@Test
public void test2() {
Map<Integer, List<String>> oldMap = Maps.newHashMap();
oldMap.put(10, Lists.newArrayList("v1", "v2", "v3"));
oldMap.put(55, Lists.newArrayList("v2", "v3"));
oldMap.put(56, Lists.newArrayList("v3"));
oldMap.put(58, Lists.newArrayList("v3"));
Map<Integer, List<String>> newMap = Maps.newHashMap();
newMap.put(10, Lists.newArrayList("v1", "v2", "v3"));
newMap.put(55, Lists.newArrayList("v2", "v3"));
newMap.put(56, Lists.newArrayList("v2", "v3"));
newMap.put(59, Lists.newArrayList("v2", "v3"));
System.out.println(oldMap); //{55=[v2, v3], 56=[v3], 10=[v1, v2, v3], 58=[v3]}
System.out.println(newMap); //{55=[v2, v3], 56=[v2, v3], 10=[v1, v2, v3], 59=[v2, v3]}
System.out.println("--------");
//交集
MapDifference<Integer, List<String>> di = Maps.difference(oldMap, newMap);
Map<Integer, List<String>> commonMap = di.entriesInCommon();
System.out.println(commonMap); //{55=[v2, v3], 10=[v1, v2, v3]}
System.out.println("--------");
//差集
for (Map.Entry<Integer, List<String>> entry : commonMap.entrySet()) {
newMap.remove(entry.getKey());
}
System.out.println(newMap); //{56=[v2, v3], 59=[v2, v3]}
System.out.println("--------");
//差集(包含左右两个不同的值)
Map<Integer, MapDifference.ValueDifference<List<String>>> diffMap = di.entriesDiffering();
System.out.println(diffMap); //{56=([v3], [v2, v3])}
System.out.println("--------");
//键只存在于左边 Map 的映射项
Map<Integer, List<String>> leftMap = di.entriesOnlyOnLeft();
System.out.println(leftMap); //{58=[v3]}
System.out.println("--------");
//键只存在于右边 Map 的映射项
Map<Integer, List<String>> rightMap = di.entriesOnlyOnRight();
System.out.println(rightMap); //{59=[v2, v3]}
System.out.println("--------");
}