2011-09-07 36 views
1

我们有一个对象集合,每个对象都有一个整数ID和一个时间戳。我们希望能够搜索重复项并根据ID更新集合。可以使用什么数据结构按多个标准对对象进行排序/比较?

但是我们也希望能够采集集合的“切片”,例如在给定时间后查找带有时间戳的每个对象。所以我们也想对时间戳进行排序。

我们使用的TreeMap,它起初似乎给我们我们想要的东西。但是因为TreeMap(以及从SortedSet派生的所有内容)只使用compareTo()并忽略equals()方法,所以我们发现基于ID搜索重复项不起作用。我们的compareTo()方法试图允许这两个条件(在ID或时间戳上搜索),但最终是大而难看的,实际上并不工作。 :)

这个集合可能会变得非常大,所以我们当然希望尽可能快地搜索/排序/插入。

+0

是否与另一个对象具有相同的id和时间戳记的对象是否重复? –

+0

对不起,应该指定 - 如果对象具有相同的ID,则该对象是重复的。 –

回答

1

您可以使用两个TreeMaps,一个将ID映射到对象,另一个将时间戳映射到对象。

然后你可以很容易地找到一个基于它的id的对象,或者它的时间戳。您还可以获得一组具有特定范围时间戳的对象(如您所知)。

缺点是显然你必须从两个集合中删除对象。然而,这不应该那么糟糕,因为每个对象都知道它是id和它的时间戳,所以如果你想通过时间戳去除,你可以免费获得id,并且你只需要再做一次日志操作。

如果你喜欢,把它们包装在你自己的集合中。

+0

感谢您的建议!我们现在试图使用这个想法,但是我们无法设置使用时间戳作为密钥的TreeMap,因为时间戳不能保证是唯一的。尝试使用TreeMap(如TreeMap <日期,列表>),但这真的很难看,而且我们仍在努力使它“工作”。 –

+0

啊,是的。这可能是一个consern。如果我是你,如果我是你,我现在就开始看着番石榴或阿帕奇的公共场所。应该有一些适合你需要的TreeMultiMap。 – aioobe

+0

谢谢 - 我们将使用Apache TreeMultiMap来完成此操作。我们试图远离许多第三方库,但在这种情况下,它似乎比重新发明轮子更好。 –

相关问题