關注微信公眾號:CodingTechWork,一起學習進步。
引言
經常遇到一些集合類之間的過濾數據、求合集之類的問題,在此以List為例,畢竟在數據庫中取數據后,我們使用比較多的是List集合進行操作。
模板
代碼
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
stringList.add("i");
stringList.add("j");
stringList.add("a");
//一、求交集
//方法1:直接通過retainAll直接過濾
List<String> stringList1 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
stringList1.retainAll(stringList);
System.out.println("交集1: " + stringList1);
//方法2:通過過濾掉存在於stringList的數據
List<String> stringList1_2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
List<String> strings = stringList1_2.stream()
.filter(item -> stringList.contains(item))
.collect(toList());
System.out.println("交集2:" + strings);
//二、並集
//有重並集
List<String> stringList2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
stringList2.addAll(stringList);
System.out.println("並集: " + stringList2);
//無重並集
List<String> stringList2_2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
List<String> stringList_1 = new ArrayList<>(Arrays.asList("a,b,c,i,j,a".split(",")));
stringList2_2.removeAll(stringList_1);
stringList_1.addAll(stringList2_2);
System.out.println("無重並集: " + stringList_1);
//三、求差集
//方法1:直接使用removeAll()方法
List<String> stringList3 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
stringList3.removeAll(stringList);
System.out.println("差集1: " + stringList3);
//方法2:通過過濾掉不存在於stringList的數據,然后和本數組進行交集處理
List<String> stringList3_2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
stringList3_2.retainAll(stringList3_2.stream()
.filter(item -> !stringList.contains(item))
.collect(toList()));
System.out.println("差集2:" + stringList3_2);
SpringApplication.run(DemoApplication.class, args);
}
結果
交集1: [a, b, c]
交集2:[a, b, c]
並集: [a, b, c, d, e, f, g, h, a, b, c, i, j, a]
無重並集: [a, b, c, i, j, a, d, e, f, g, h]
差集1: [d, e, f, g, h]
差集2:[d, e, f, g, h]
注意list賦值問題
如果使用了賦值方式,如list1 = list0
,然后list1.retainAll(list2)
或者list1.removeAll(list2)
其實list0的值也變化了。因為lis1和list0指向了同一個地址。
代碼:
List<String> s1 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
List<String> s2 = s1;
System.out.println("s1地址和s2是否相等(是否為同一個對象): " + (s1 == s2));
s2.remove("g");
s2.remove("h");
System.out.println("s1: " + s1);
System.out.println("s2: " + s2);
結果:
s1地址和s2是否相等(是否為同一個對象): true
s1: [a, b, c, d, e, f]
s2: [a, b, c, d, e, f]
所以我們需要使用 List<String> list1= new ArrayList<>(list0);
的方式
代碼:
List<String> s1 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
List<String> s2 = new ArrayList<>(s1);
System.out.println("s1地址和s2是否相等(是否為同一個對象): " + (s1 == s2));
s2.remove("g");
s2.remove("h");
System.out.println("s1: " + s1);
System.out.println("s2: " + s2);
結果:
s1地址和s2是否相等(是否為同一個對象): false
s1: [a, b, c, d, e, f, g, h]
s2: [a, b, c, d, e, f]
同時,我們1在使用removeAll()
方法時,有時候會遇到報錯或者失效的情形,比如List中是一個一個對象類,且沒有重寫過equals和hashCode方法,就會帶來這種不相等的情況,從而導致失效,這個問題也要注意一下。