数据去重
1,排序+压缩
// 可以自定义比较器,兼容好多类!!!
// 数据准备
List<Object> list = new Random()
.ints(1,10)
.limit(10)
.mapToObj(a ->new Integer(a))
.collect(Collectors.toList());
// 排序,自定义比较器位置
list.sort((a,b)->a.hashCode()-b.hashCode());
// 数据压缩
int index = 0;
for (int i = 1; i < list.size(); i++){
if (list.get(i) == list.get(i - 1)) {
Object o = list.get(index ++);
o = list.get(i);
}
}
// 取压缩后的数据
list = list.subList(0,index);
2,stream流中distinct
// 需要重写equals,大多数情况不符合。
// 数据准备
List<Object> list = new Random()
.ints(1,10)
.limit(10)
.mapToObj(a ->new Integer(a))
.collect(Collectors.toList());
// distinct,直接元素进行比较,如果重写equals,可以使用
list = list.stream().distinct()
.collect(Collectors.toList());
3,steam流中filter+set识别
// 数据准备
List<Object> list = new Random()
.ints(1,10)
.limit(10)
.mapToObj(a ->new Integer(a))
.collect(Collectors.toList());
// set做筛子判断,使用filter进行过滤,treeSet可以自定义比较器,代码非侵入
TreeSet<Object> set = new TreeSet<Object>((a,b)->{
// 重写比较器的比较方法,改成自己需要的。
return a.hashCode() - b.hashCode();
});
// 去重
list = list.stream().filter(a -> {
if (set.contains(a)) return false;
set.add(a);
return true;
}).collect(Collectors.toList());
4,set直接去重
// 数据准备
List<Object> list = new Random()
.ints(1,10)
.limit(10)
.mapToObj(a ->new Integer(a))
.collect(Collectors.toList());
// a:去重,全部塞到set中。
TreeSet<Object> set = new TreeSet<Object>((a,b)->{
// 重写比较器的比较方法,改成自己需要的。
return a.hashCode() - b.hashCode();
});
// 塞进去,拿出来
set.addAll(list);
list = set.stream().collect(Collectors.toList());
// b:或者这样
list =list.stream()
.collect(
Collectors.collectingAndThen(
Collectors.toCollection(() ->
// 比较器,需要则修改
new TreeSet<>((a,b)->
a.hashCode() - b.hashCode())),
ArrayList::new));