使用什么数据结构

时间:2011-07-28 14:07:27

标签: java data-structures

我正在寻找具有以下属性的数据结构。

  • 存储tuple<Double,Integer,Integer>的列表。订单仅在double。具有相同double值的两个元组被认为是相同的。
  • 支持重复。
  • 需要能够按升序进行遍历。如果有重复项,稍后添加的那个应该有更高的顺序。
  • 快速查找/插入
  • 快速删除,请注意删除始终遵循此模式

方法包含删除:

for(int i=list.size()-1;i>=0;i--){// assume list is in ascending order
    if(list[j:i] can be merged){
        remove list[j:i-1];
        update list[i]'s two integers;
        i = j-1;
    }
}

我目前使用ArrayList并保持排序。使用二进制搜索快速查找。然而,插入和删除将涉及在存储器中的大量复制,例如,插入列表前面会移动所有元素。

2 个答案:

答案 0 :(得分:1)

一种解决方案是将排序映射到元组列表:

SortedMap<Double,List<Tuple<Integer,Integer>>>

声明行有点难看,但它会起作用。之前我曾多次使用地图列表。关于它的好处是你可以从列表中删除项目,只要你的列表都是短的,你的移动数量就会减少。要遍历整个结构,您需要创建自己的迭代器,或者调整原始代码。

答案 1 :(得分:0)

如果您决定编写自己的Double比较器,有几点需要注意。

首先,浮点平等是一个非常棘手的领域。默认情况下,当您的代码在不同的虚拟机中运行时,Java无法确保使用浮点数学,尽管可以使用strictfp关键字来完成。浮点运算中的这种不一致性可能会导致应用程序出现问题,而这些应用程序并不知道这一点,并且可以在多个虚拟机之间进行通信,例如服务器和客户端通信。

第二个棘手的问题是比较器在对象上运行,这意味着你将使用双打而不是双打。以下四个操作导致Double被取消装箱为double:&lt ;,&lt; =,&gt;和&gt; =。以下两个会导致取消装箱:==和!=。这两个运算符执行对象存储器指针比较。底线,在进行比较之前,将双打手动打开成双打;它将大大减少错误。