List集合数据去重


对list数据去重的方法有如下几种,先以String类型的集合进行说明,对象的元素比较麻烦:

定义的集合如下:

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("5");
list.add("3");
list.add("2");
list.add("4");

1.借助Set的特性进行去重

set集合中的元素是不可重复的。不会保持原来的顺序

    public static List<String> distinctList(List<String> list) {
        List<String> newList = new ArrayList();
        if (null != list && list.size() > 0) {
            Set set = new HashSet();
            set.addAll(list);
            newList.addAll(set);
        }
        return newList;
    }

这种情况不会保持原来顺序,原因是set是无序的。

2.利用set集合特性保持顺序一致去重

在创建list集合时传入LinkedhashSet,会保持原来的顺序

    public static List<String> distinctList(List<String> list) {
        List<String> newList = new ArrayList();
        if (null != list && list.size() > 0) {
            newList = new ArrayList<>(new LinkedHashSet<>(list));
        }
        return newList;
    }

 当然可使用这种方式对元素是对象的集合进行去重:

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User(1,"admin"));
        list.add(new User(2,"zhailiu"));
        list.add(new User(3,"lisi"));
        list.add(new User(1,"admin"));
        list.add(new User(3,"zhangsan"));
        list.add(new User(1,"admin"));
        list = new ArrayList<>(new LinkedHashSet<>(list));
    }

其中User对象如下:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
}

需要注意的是,使用这种方式,必须重写equals与hashCode方法。(可借助lombok插件来重写)

3.使用Java8特性去重

使用java8集合的新特性stream的distinct()方法。可保持原来的顺序

    public static List<String> distinctList(List<String> list) {
        List<String> newList = new ArrayList();
        if (null != list && list.size() > 0) {
            newList = list.stream().distinct().collect(Collectors.toList());
        }
        return newList;
    }

 当然对于对象的去重也可以使用这种方式:

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User(1,"admin"));
        list.add(new User(2,"zhailiu"));
        list.add(new User(3,"lisi"));
        list.add(new User(1,"admin"));
        list.add(new User(3,"zhangsan"));
        list.add(new User(1,"admin"));
        list = list.stream().distinct().collect(Collectors.toList());
    }

前提是重写对象的equals与hashCode方法。

4.遍历集合进行判断

遍历后判断是否包含,而赋给另一个list集合。可保持原来的顺序

    public static List<String> distinctList(List<String> list) {
        List<String> newList = new ArrayList();
        if (null != list && list.size() > 0) {
            for (String str : list) {
                if (!newList.contains(str)) {
                    newList.add(str);
                }
            }
        }
        return newList;
    }

 这种方式在复杂类型时可能会使用。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM