请问如何去除LIST里的重复元素并合并相同的对象

pk87654 2015-09-29 09:16:08
姓名 日期 系数
小刘 2015/9/1 0.15
小刘 2015/9/1 0.35
小刘 2015/9/2 0.15
小强 2015/9/2 0.35
小强 2015/9/2 0.15
小图 2015/9/5 0.5


得到的结果
小刘 2015/9/1 0.5
小刘 2015/9/2 0.15
小强 2015/9/2 0.5
小图 2015/9/5 0.5
...全文
5023 12 点赞 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
最简单的方法就是先把他方法哦set里面,再拿出来Set< String > set = new TreeSet< String >(list);
  • 打赏
  • 举报
回复
hanny_peng 2017-02-17
list 是列表 元素可重复有顺序,set 是集合 元素不可重复无顺序。
  • 打赏
  • 举报
回复
vip471153310 2015-12-29
楼主解决了没啊 ,求解决方法
  • 打赏
  • 举报
回复
halking 2015-09-30
list 是列表 元素可重复有顺序。 set 是集合 元素不可重复无顺序。 直接用set 就行。
  • 打赏
  • 举报
回复
DY1201 2015-09-30
使用treeset然后自定义比较器
  • 打赏
  • 举报
回复
鱼台猿人 2015-09-30
map呗,判断下而已,然后加起来,然后再遍历map拿出来就是了
  • 打赏
  • 举报
回复
大大大白 2015-09-30
set可以去除重复啊
  • 打赏
  • 举报
回复
解开者 2015-09-30
public class A {
	public static void main(String[] args) {
		List<S> list = new ArrayList<S>();
		list.add(new S("小刘	2015/9/1	0.15"));
		list.add(new S("小刘	2015/9/1	0.35"));
		list.add(new S("小刘	2015/9/2	0.15"));
		list.add(new S("小强	2015/9/2	0.35"));
		list.add(new S("小强	2015/9/2	0.15"));
		list.add(new S("小图	2015/9/5	0.5"));
		Map<S, S> map = new HashMap<S, S>();
		for (S s : list) {
			if (map.containsKey(s)) {
				map.put(s, S.merge(s, map.get(s)));
			} else {
				map.put(s, s);
			}
		}
		System.out.println(map.values());
	}
}

class S {
	String name;
	String date;
	double num;

	S(String name, String date, double num) {
		build(name, date, num);
	}

	S(String str) {
		String[] s = str.split("\\\t");
		build(s[0], s[1], Double.parseDouble(s[2]));
	}

	private void build(String name, String date, double num) {
		this.name = name;
		this.date = date;
		this.num = num;
	}

	static S merge(S s1, S s2) {
		if (!s1.equals(s2)) {
			throw new IllegalArgumentException();
		}
		return new S(s1.name, s1.date, s1.num + s2.num);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((date == null) ? 0 : date.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		S other = (S) obj;
		if (date == null) {
			if (other.date != null)
				return false;
		} else if (!date.equals(other.date))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "S [name=" + name + ", date=" + date + ", num=" + num + "]";
	}
}
  • 打赏
  • 举报
回复
Defonds 2015-09-30
不用这么麻烦吧?一句搞定:
Set< String > set = new TreeSet< String >(list);
  • 打赏
  • 举报
回复
兔子托尼啊 2015-09-30
循环判断然后叠加。
  • 打赏
  • 举报
回复
番茄鲨鱼面 2015-09-30
首先确定两个问题: 1.使用姓名和日期两个字段可以判断是否是相同? 2.相同元素在添加到list中要把系数相加? 如果上面上面猜测是对的,那么可以这样做: 1.重写“姓名 日期 系数”对象的equals和hashcode方法,使用姓名和日期。 2.在添加到list之前,先判断是否contains。 3.1.如果contains,那么将这个对象的系数+要添加的对象的系数。 3.2.如果不contains,那么直接add。
  • 打赏
  • 举报
回复
Strive20101101 2015-09-30
为什么不在查询时用DISTINCT去重?
  • 打赏
  • 举报
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2015-09-29 09:16
社区公告
暂无公告