这可能有点棘手,而且我不确定它是否会考虑到这一点,并且#34;
。我的设置如下:
我得到一个包含4个字段(ID,时间戳,类型和值)的对象输入。我必须按照时间戳的顺序将那些插入到集合中。到目前为止很容易:
ConcurrentSkipListSet<ScheduleElement> storage = new ConcurrentSkipListSet<>(new SEComparator());
现在是棘手的部分:一小部分对象来自同一个&#34;资产&#34;并需要合并。基本上每当有一个&#34;重复&#34; (相同的ID,时间戳和类型)它们必须通过添加值合并为一个。
我可以通过两个单独的步骤轻松完成此操作。
但在这种情况下,我必须重复(相当冗长)Set两次。鉴于性能相当重要,我不愿意这样做。
我的第一个想法是,以某种方式改变我的比较器,在compareTo = 0时,对象1的值增加了对象2 WHILE比较的值。由于比较器返回0,对象2被丢弃。
public class SEComparator implements Comparator {
public int compare(ScheduleElement o1, ScheduleElement o2) {
int i = (o1.getTime().compareTo(o2.getTime()));
if (i == 0) {
i = (o1.getId()).compareTo(o2.getId());
if (i == 0) {
i = (o1.getType().compareTo(o2.getType()));
if (i == 0) {
o1.setValue(o1.getValue()+o2.getValue());
}
}
}
return i;
}
@Override
public int compare(Object o1, Object o2) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
现在对编码缺乏经验,我甚至无法开始猜测这样的黑客是否会破坏完全出乎意料的事情。
这是一个应该避免的彻底黑客攻击吗?或者,如果没有,您对这种解决方案的关键点有经验吗?
答案 0 :(得分:0)
如果您需要ID
,timestamp
,type
键,请更新value
以获取具有相同键<的数据< / strong>字段,那么您需要Map
,而不是Set
。
请注意我如何突出显示上面的键?这是因为Map
由键和值组成。
因此,使用三个关键字段创建一个密钥类。您是希望地图的价值仅为价值还是全部ScheduleElement
,完全取决于您。