Java关于List集合去重方案详细介绍

网友投稿 281 2022-12-08

Java关于List集合去重方案详细介绍

1 常规去重

碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素。

// 遍历后判断赋给另一个List集合,保持原来顺序

public static void ridRepeat1(List list) {

System.out.println("list = [" + list + "]");

List listNew = new ArrayList();

for (String str : list) {

if (!listNew.contains(str)) {

listNew.add(str);

}

}

System.out.println("listNew = [" + listNew + "]");

}

// Set集合去重,保持原来顺序

uDwMKXwmhttp://public static void ridRepeat2(List list) {

System.out.println("list = [" + list + "]");

List listNew = new ArrayList();

Set set = new HashSet();

for (String str : list) {

if (set.add(str)) {

listNew.add(str);

}

}

System.out.println("listNew = [" + listNew + "]");

}

// Set去重 由于Set(HashSet)的无序性,不会保持原来顺序

public static void ridRepeat3(List list) {

System.out.println("list = [" + list + "]");

Set set = new HashSet();

List listNew = new ArrayList();

set.addAll(list);

listNew.addAll(set);

System.out.println("listNew = [" + listNew + "]");

}

// Set通过HashSet去重(将ridRepeat3方法缩减为一行) 无序

public static void ridRepeat4(List list) {

System.out.println("list = [" + list + "]");

List listNew = new ArrayList(new HashSet(list));

System.out.println("listNew = [" + listNew + "]");

}

// Set通过TreeSet去重 会按字典顺序重排序

public static void ridRepeat5(List list) {

System.out.println("list = [" + list + "]");

List listNew = new ArrayList(new TreeSet(list));

System.out.println("listNew = [" + listNew + "]");

}

// Set通过LinkedHashSet去重 保持原来顺序

public static void ridRepeat6(List list) {

System.out.println("list = [" + list + "]");

List listNew = new ArrayList(new LinkedHashSet(list));

System.out.println("listNew = [" + listNew + "]");

}

stream去重

//利用java8的stream去重

List uniqueList = list.stream().distinct().collect(Collectors.toList());

System.out.println(uniqueList.toString());

上面的方法在List元素为基本数据类型及String类型时是可以的,但是如果List集合元素为对象,却失效了!

2 对象去重

可利用for循环遍历的方式进行判断去重,很简单不赘述,看如下方法:

2.1 stream去重

// 根据name属性去重

List uniqueNameList = userList

.stream()

.collect(collectingAndThen(

toCollection(() -> new TreeSet<>(comparing(User::getName))), ArrayList::new)

);

System.out.println("根据name去重后集合元素:" + uniqueNameList.toString());

// 根据name,age属性去重

List uniqueNameAndAgeList = userList

.stream()

.collect(collectingAndThen(

toCollection(() -> new TreeSet<>(comparing(o -> o.getName() + ";" + o.getAge()))), ArrayList::new)

);

System.out.println("根据name,age去重后集合元素:" + uniqueNameAndAgeList.toString());

输出结果:

重写equals()、hashCode()

//重写equals方法

@Override

public boolean equals(Object obj) {

User user = (User) obj;

return name.equals(user.getName()) && (age==user.getAge());

}

//重写hashCode方法

@Override

public int hashCode() {

String str = name + age;

return str.hashCode();

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java开发之手把手教你搭建企业级工程SSM框架
下一篇:关于Spring的@Autowired依赖注入常见错误的总结
相关文章

 发表评论

暂时没有评论,来抢沙发吧~