如何在将类似对象添加到集合时进行性能比较和合并

时间:2016-10-14 06:42:46

标签: java performance set thread-safety comparator

这可能有点棘手,而且我不确定它是否会考虑到这一点,并且#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.");
}
}

现在对编码缺乏经验,我甚至无法开始猜测这样的黑客是否会破坏完全出乎意料的事情。

这是一个应该避免的彻底黑客攻击吗?或者,如果没有,您对这种解决方案的关键点有经验吗?

1 个答案:

答案 0 :(得分:0)

如果您需要IDtimestamptype ,请更新value以获取具有相同键<的数据< / strong>字段,那么您需要Map,而不是Set

请注意我如何突出显示上面的?这是因为Map组成。

因此,使用三个关键字段创建一个密钥类。您是希望地图的价值仅为价值还是全部ScheduleElement,完全取决于您。