List去重及使用jdk8语法操作list去重

1. 集合List去重

List是有序的,可以重复的。Set是无序的,不可以重复的。List去重,如果T是基本类型的,只需要将List转成Set就可以去重;如果T是对象类型,那么需要重新equals()和hashCode()方法。

1.1 基本类型

假如有一个List集合[Simon, kevin, lucy, kevin, lily],去掉其中重复的元素kevin

List<String> list = new ArrayList<>();
list.add("Simon");
list.add("kevin");
list.add("lucy");
list.add("kevin");
list.add("lily");

1.1.1 List< String>转Set< String>去重

通过List转Set去重,然后存到一个新的List集合list3里面

Set<String> set = new HashSet<>(list);
List<String> list3 = new ArrayList<>(set);
System.out.println("list3="+list3);

这样去重后的问题:新的集合lis3t和原来的list集合里面元素的顺序不一致

要让去重后的List集合和原来的List集合一致,可以如下操作:
先foreache list集合,然后去set.add()判断,如果add()方法返回为true便给新的list集合去添加这个元素。
具体的实现代码如下:

Set<String> set2 = new HashSet<>();
List<String> list4 = new ArrayList<>();
for(String str : list) {
	if(set2.add(str)) {
		list4.add(str);
	}
}
System.out.println("list4="+list4);

1.1.2 jdk8的新语法操作List< String>去重

List<String> list2 = list.stream().distinct().collect(Collectors.toList());
System.out.println("list2="+list2);

这样操作后新的list集合list2的顺序和list里面的顺序一致

1.2 对象类型

对象类型,需要重新equals()和hashCode()方法,才能够判断出来两个对象是同一个对象,然后给去重。

public class User {
	
	private String name;
	
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}

	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public int hashCode() {
		String str = name + age;
		return str.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		User user = (User)obj;
		return name.equals(user.name) && age==user.age;
	}

}

需要去重的List集合List< User >:

List<User> list = new ArrayList<User>() {{
	add(new User("Simon", 24));
	add(new User("kevin", 28));
	add(new User("lucy", 23));
	add(new User("kevin", 28));
	add(new User("lily", 27));
}};
System.out.println("list="+list);

1.2.1 List< User>转Set< User>去重

Set<User> set = new HashSet<>(list);
System.out.println(set);
List<User> list3 = new ArrayList<>();
list3.addAll(set);
System.out.println("list3="+list3);

这样操作是去重了,但是集合list3的顺序和集合list的不一致

要让去重后的集合和list集合顺序一致,可以如下操作:

Set<User> set2 = new HashSet<>();
List<User> list4 = new ArrayList<>();
for (User user : list) {
	if(set2.add(user)) {
		list4.add(user);
	}
}
System.out.println("list4="+list4);

1.2.2 使用jdk8新语法List< User>去重

重写equals()和hashCode()方法

List<User> list2 = list.stream().distinct().collect(Collectors.toList());
System.out.println("list2="+list2);

你可能感兴趣的:(java)