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

本文详细介绍并演示了五种不同的Java列表去重方法,包括使用TreeSet、HashSet、for循环、HashMap及stream流,每种方法都有具体的代码实现与运行结果展示。
该文章已生成可运行项目,

目录

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<User1> list = new ArrayList<User1>();
		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<User1> newList = removeDuplicateUser(list);
		for (User1 user : newList) {
			System.out.println(user);
		}
	}

	private static ArrayList<User1> removeDuplicateUser(List<User1> users) {
		Set<User1> set = new TreeSet<User1>(new Comparator<User1>() {
			@Override
			public int compare(User1 o1, User1 o2) {
				// 字符串,则按照asicc码升序排列
				return o1.getId().compareTo(o2.getId());
			}
		});
		set.addAll(users);
		return new ArrayList<User1>(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<User2> list = new ArrayList<User2>();
		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<User2> userSet = new HashSet<User2>(list);
		List<User2> newList = new ArrayList<User2>(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<User3> list = new ArrayList<User3>();
		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<User3> repeatList = new ArrayList<User3>();// 用于存放重复的元素的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<User4> list = new ArrayList<User4>();
		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<User4> newList = new ArrayList<User4>();// 用于存放没有重复的元素的list
		List<User4> repeatList = new ArrayList<User4>();// 用于存放重复的元素的list
		// 利用map.containsKey()
		Map<String, Integer> 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<User5> list = new ArrayList<User5>();
		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<User5> newList = new ArrayList<User5>();// 用于存放没有重复的元素的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.youkuaiyun.com/u013821825/article/details/66969683
https://www.cnblogs.com/pcheng/p/10930944.html
https://blog.youkuaiyun.com/qq_34203492/article/details/78561562

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值