Java的List中放对象根据指定字段去除重复数据

目录

0.码仙励志

1.TreeSet去重

2.HashSet去重

3.for循环去重

4.HashMap去重

5.stream去重


0.码仙励志

人生四然:来是偶然,去是必然,尽其当然,顺其自然。

1.TreeSet去重

package com.maxian.test;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class TestList1 {

	public static void main(String[] args) {
		List list = new ArrayList();
		list.add(new User1("1", "张三1"));
		list.add(new User1("1", "张三2"));
		list.add(new User1("2", "张三3"));
		list.add(new User1("2", "张三4"));
		list.add(new User1("3", "张三5"));
		System.out.println("去重前:");
		for (User1 user : list) {
			System.out.println(user);
		}
		System.out.println("去重后:");
		List newList = removeDuplicateUser(list);
		for (User1 user : newList) {
			System.out.println(user);
		}
	}

	private static ArrayList removeDuplicateUser(List users) {
		Set set = new TreeSet(new Comparator() {
			@Override
			public int compare(User1 o1, User1 o2) {
				// 字符串,则按照asicc码升序排列
				return o1.getId().compareTo(o2.getId());
			}
		});
		set.addAll(users);
		return new ArrayList(set);
	}
}

class User1 {

	private String id;
	private String name;

	public User1(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

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

}

运行结果:

去重前:
User1 [id=1, name=张三1]
User1 [id=1, name=张三2]
User1 [id=2, name=张三3]
User1 [id=2, name=张三4]
User1 [id=3, name=张三5]
去重后:
User1 [id=1, name=张三1]
User1 [id=2, name=张三3]
User1 [id=3, name=张三5]

2.HashSet去重

这种方式需要重写equalshashCode方法

package com.maxian.test;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class TestList2 {

	public static void main(String[] args) {
		List list = new ArrayList();
		list.add(new User2("1", "张三1"));
		list.add(new User2("1", "张三2"));
		list.add(new User2("2", "张三3"));
		list.add(new User2("2", "张三4"));
		list.add(new User2("3", "张三5"));
		System.out.println("去重前:");
		for (User2 user : list) {
			System.out.println(user);
		}
		System.out.println("去重后:");
		Set userSet = new HashSet(list);
		List newList = new ArrayList(userSet);
		for (User2 user : newList) {
			System.out.println(user);
		}
	}

}

class User2 {

	private String id;
	private String name;

	public User2(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

	@Override
	public boolean equals(Object obj) {
		User2 u = (User2) obj;
		return id.equals(u.id);
	}

	@Override
	public int hashCode() {
		String in = id;
		return in.hashCode();
	}

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

}

运行结果:

去重前:
User2 [id=1, name=张三1]
User2 [id=1, name=张三2]
User2 [id=2, name=张三3]
User2 [id=2, name=张三4]
User2 [id=3, name=张三5]
去重后:
User2 [id=1, name=张三1]
User2 [id=2, name=张三3]
User2 [id=3, name=张三5]

3.for循环去重

package com.maxian.test;

import java.util.ArrayList;
import java.util.List;

public class TestList3 {

	public static void main(String[] args) {
		List list = new ArrayList();
		list.add(new User3("1", "张三1"));
		list.add(new User3("1", "张三2"));
		list.add(new User3("2", "张三3"));
		list.add(new User3("2", "张三4"));
		list.add(new User3("3", "张三5"));
		System.out.println("去重前:");
		for (User3 user : list) {
			System.out.println(user);
		}
		System.out.println("去重后:");
		List repeatList = new ArrayList();// 用于存放重复的元素的list
		for (int i = 0; i < list.size() - 1; i++) {
			for (int j = list.size() - 1; j > i; j--) {
				if (list.get(j).getId().equals(list.get(i).getId())) {
					repeatList.add(list.get(j));// 把相同元素加入list(找出相同的)
					list.remove(j);// 删除重复元素
				}
			}
		}
		for (User3 user : list) {
			System.out.println(user);
		}
		System.out.println("相同的元素:");
		for (User3 user : repeatList) {
			System.out.println(user);
		}
	}

}

class User3 {

	private String id;
	private String name;

	public User3(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

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

}

 运行结果:

去重前:
User3 [id=1, name=张三1]
User3 [id=1, name=张三2]
User3 [id=2, name=张三3]
User3 [id=2, name=张三4]
User3 [id=3, name=张三5]
去重后:
User3 [id=1, name=张三1]
User3 [id=2, name=张三3]
User3 [id=3, name=张三5]
相同的元素:
User3 [id=1, name=张三2]
User3 [id=2, name=张三4]

4.HashMap去重

package com.maxian.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestList4 {

	public static void main(String[] args) {
		List list = new ArrayList();
		list.add(new User4("1", "张三1"));
		list.add(new User4("1", "张三2"));
		list.add(new User4("2", "张三3"));
		list.add(new User4("2", "张三4"));
		list.add(new User4("3", "张三5"));
		System.out.println("去重前:");
		for (User4 user : list) {
			System.out.println(user);
		}
		System.out.println("去重后:");
		List newList = new ArrayList();// 用于存放没有重复的元素的list
		List repeatList = new ArrayList();// 用于存放重复的元素的list
		// 利用map.containsKey()
		Map map = new HashMap<>();
		for (User4 user : list) {
			// 1:map.containsKey() 检测key是否重复
			if (map.containsKey(user.getId())) {
				repeatList.add(user);
			} else {
				map.put(user.getId(), 1);
				newList.add(user);
			}
			// 2: 这个key是不是存在对应的value(key是否在map中)
//			if (map.get(user.getId()) == null) {
//				map.put(user.getId(), 1);
//				newList.add(user);
//			} else {
//				repeatList.add(user);
//			}
		}
		for (User4 user : newList) {
			System.out.println(user);
		}
		System.out.println("相同的元素:");
		for (User4 user : repeatList) {
			System.out.println(user);
		}

	}

}

class User4 {

	private String id;
	private String name;

	public User4(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

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

}

运行结果:

去重前:
User4 [id=1, name=张三1]
User4 [id=1, name=张三2]
User4 [id=2, name=张三3]
User4 [id=2, name=张三4]
User4 [id=3, name=张三5]
去重后:
User4 [id=1, name=张三1]
User4 [id=2, name=张三3]
User4 [id=3, name=张三5]
相同的元素:
User4 [id=1, name=张三2]
User4 [id=2, name=张三4]

5.stream去重

需要jdk版本为1.8及以上

package com.maxian.test;

import java.util.ArrayList;
import java.util.List;

public class TestList5 {

	public static void main(String[] args) {
		List list = new ArrayList();
		list.add(new User5("1", "张三1"));
		list.add(new User5("1", "张三2"));
		list.add(new User5("2", "张三3"));
		list.add(new User5("2", "张三4"));
		list.add(new User5("3", "张三5"));
		System.out.println("去重前:");
		for (User5 user : list) {
			System.out.println(user);
		}
		System.out.println("去重后:");
		List newList = new ArrayList();// 用于存放没有重复的元素的list
		for (User5 user : list) {
			// anyMatch表示,判断的条件里,任意一个元素成功,返回true
			boolean b = newList.stream().anyMatch(u -> u.getId().equals(user.getId()));
			if (!b) {
				newList.add(user);
			}
		}
		for (User5 user : newList) {
			System.out.println(user);
		}
	}
}

class User5 {

	private String id;
	private String name;

	public User5(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

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

}

运行结果:

去重前:
User5 [id=1, name=张三1]
User5 [id=1, name=张三2]
User5 [id=2, name=张三3]
User5 [id=2, name=张三4]
User5 [id=3, name=张三5]
去重后:
User5 [id=1, name=张三1]
User5 [id=2, name=张三3]
User5 [id=3, name=张三5]

参考文献:

https://blog.csdn.net/u013821825/article/details/66969683
https://www.cnblogs.com/pcheng/p/10930944.html
https://blog.csdn.net/qq_34203492/article/details/78561562

你可能感兴趣的:(Javase)