如何在将相似对象添加到集合时高效地比较和合并它们

How to performantly compare and merge similar objects while adding them to a set

这可能有点棘手,我不确定它是否被认为是 "don't"。

我的设置如下:

我得到一个包含 4 个字段(ID、时间戳、类型和值)的对象输入。我必须按照时间戳的顺序将那些插入到一个集合中。到目前为止很简单:

ConcurrentSkipListSet<ScheduleElement> storage = new ConcurrentSkipListSet<>(new SEComparator());

现在是棘手的部分:一小部分对象来自同一个 "asset" 并且需要合并。基本上只要有 "duplicate"(相同的 ID、时间戳和类型),就必须通过添加值将它们合并为一个。

我可以通过两个单独的步骤轻松完成此操作。

但在那种情况下,我必须检查(相当冗长的)设置两次。鉴于性能相当关键,我宁愿不这样做。

我的第一个想法是,以某种方式改变我的比较器,在 compareTo = 0 时,对象 1 的值在比较时增加对象 2 的值。由于比较器返回 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.");
}
}

现在我对编码相当缺乏经验,我什至无法开始猜测这样的黑客攻击是否会破坏完全出乎意料的东西。

这是完全应该避免的黑客行为吗?或者,如果没有,您对此类解决方案的关键点有任何经验吗?

如果您需要通过 IDtimestamptype key 并使用相同的数据更新 value key 字段,那么你需要一个 Map,而不是 Set.

注意到我是如何在上面突出显示 key 的吗?这是因为 Mapkeyvalue.

组成

因此,使用三个键字段创建一个键 class。您是希望地图的值只是值还是完整 ScheduleElement 完全取决于您。