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集合特性保持顺序一致去重

2.1String去重

在创建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;
    }

2.2对象去重 

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

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

其中User对象如下:

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

import java.util.Objects;

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(id, user.id) && Objects.equals(phone, user.phone);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, phone);
    }
}

需要注意的是,使用这种方式,必须重写equals与hashCode方法。在里面指定需要去重的属性,可以是一个,也可以是多个。这里是以id和phone进行去重。

3.使用Java8特性去重

3.1String去重

使用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;
    }

3.2String去重

当然对于对象的去重也可以使用这种方式:(也需要重写equals和hashCode方法)

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

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

4.遍历集合进行判断

4.1String去重

遍历后判断是否包含,而赋给另一个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;
    }

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

原文地址:https://www.cnblogs.com/zys2019/p/15541444.html