關(guān)注:CodingTechWork手报,一起學(xué)習(xí)進(jìn)步蚯舱。
引言
??經(jīng)常遇到一些集合類之間的過濾數(shù)據(jù)改化、求合集之類的問題,在此以List為例枉昏,畢竟在數(shù)據(jù)庫中取數(shù)據(jù)后陈肛,我們使用比較多的是List集合進(jìn)行操作。
模板
代碼
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的數(shù)據(jù)
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的數(shù)據(jù)晰奖,然后和本數(shù)組進(jìn)行交集處理
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);
}
結(jié)果
交集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)
其實(shí)list0的值也變化了畅涂。因?yàn)閘is1和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);
結(jié)果:
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);
結(jié)果:
s1地址和s2是否相等(是否為同一個對象): false
s1: [a, b, c, d, e, f, g, h]
s2: [a, b, c, d, e, f]
??同時(shí),我們1在使用removeAll()
方法時(shí)午衰,有時(shí)候會遇到報(bào)錯或者失效的情形立宜,比如List中是一個一個對象類,且沒有重寫過equals和hashCode方法臊岸,就會帶來這種不相等的情況橙数,從而導(dǎo)致失效,這個問題也要注意一下帅戒。