java将两个集合添加到一起,如果存在则合并,如果不存在则添加
当将两个电视节目相加时,假设它们是同一个节目,如果电视节目one
有一个季节1
,而电视节目two
有一个季节1
,它不会将电视节目1
中的episodes
季节1
合并到电视节目one
中的1
季节,因为它认为它们是相等的。然而,这个问题是,如果我也在equals函数中添加了第四季的剧集,那么TVShow one将包含两个条目,都是第1季,而不是将两个剧集合并为一个
TreeSet是正确的收藏吗
我该怎么做呢
public class TVShow extends Show implements Iterable<Season> {
private final TreeSet<Season> seasons;
}
public class Season implements Iterable<Episode>, Comparable<Season> {
private final TreeSet<Episode> episodes;
private String name = null;
private int number;
@Override
public boolean equals(Object o) {
if (o == this)
return true;
else if (!(o instanceof Season))
return false;
else {
Season other = (Season) o;
return this.number == other.number;
}
}
}
public class Episode implements Comparable<Episode> {
private String name;
private int number;
}
例如:
TVShow one = new TVShow();
Season s1 = new Season(1);
s1.add(new Episode(1));
one.add(s1);
TVShow two = new TVShow();
Season sOne = new Season(1);
sOne.add(new Episode(1));
sOne.add(new Episode(2));
sOne.add(new Episode(3));
two.add(sOne);
one.add(two);
结果: 第一季{1,集{1,2,3}}
# 1 楼答案
合并两个季节非常简单,因为
episodes
字段是一个Set
,您只需调用addAll()
,任何重复项都会被忽略合并两个节目更复杂,因为当发现重复的季节时,它们需要合并,所以你不能只调用^{,因为这将添加新的季节,但不会合并现有的季节
问题是
TreeSet
没有一种方法可以通过number
获得现有的季节。解决这个问题的一种方法是将Set
更改为Map
,由number
键控。这将是推荐的方法,但是有一个技巧,使用subSet()
和first()
在Set
中获取“等于”正在查找的对象的对象因此,为了完成代码,消除
name
字段和Iterable
接口,因为它们对问题无关紧要,我们得到:测试
输出
输出显示
show2
未被修改,在show1
中,第1季被合并,第3季被添加更新:使用
Map
替代Set
的替代版本<推荐