具体来说,我需要一个使用一个字段A进行访问而使用另一个(字段S)进行排序的集合,但是接受重复项的已排序集合就足够了。
我经常来到这里,我确实需要这个集合,TreeMap不是一个选择,因为它不允许重复。所以现在是时候在这里问了。在stackoverflow here和here上指出了几种解决方法-即:
TreeMap<Field_S, List<Value>>
:对我来说,问题是列表的内存开销以及原始键有人有更好的建议吗?还是应该扮演我自己的排序数据结构(哪个?)?另外,其他资源(在Java,开放源代码,单元测试和小型部门中)也不错。
更新
目前有关我的用例的更多细节(尽管上次我有类似的需求)。我希望能够收集(数百万个)引用文献
因此,所有人都为斐波那契堆哭泣,但我担心每个元素的开销都太大->这就是我考虑使用内存效率更高的“排序+分段数组”解决方案的原因。
最佳答案
当需要分类的集合时,应该仔分割析需求。
如果大多数操作是插入操作,而只有少数几个操作要搜索,则使用已排序的集合,即保持元素在集合中不断进行排序,将不是一个好选择(由于保持插入时元素排序的开销比较大,最常见的操作)。
在这种情况下,最好保留未排序的集合并仅在需要时进行排序。即在搜索之前。您甚至可以使用简单的List
并在需要时对其进行排序(使用Collections.sort
,即mergesort)。但是,我建议您谨慎使用此方法,因为要有效执行此假设,那就是您要处理大数据。在很小的数据中,甚至线性搜索也足够了。
如果大多数操作都在搜索中,那么您可以使用排序后的集合,从我的角度来看,有一些数据结构可供选择(您已经提到过),并且可以进行基准测试以查看哪种数据结构满足您的需求。