Java 使用什么数据结构

Java 使用什么数据结构,java,data-structures,Java,Data Structures,我正在寻找具有以下属性的数据结构 存储元组的列表。订单只在double上。具有相同的双值的两个元组是相同的。 支持重复项 需要能够以升序遍历。如果存在重复项,则后面添加的应具有更高的顺序 快速查找/插入 快速移除,请注意移除始终遵循此模式 方法包含删除: for(int i=list.size()-1;i>=0;i--){// assume list is in ascending order if(list[j:i] can be merged){ remov

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

  • 存储
    元组的列表。订单只在
    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并对其进行排序。使用二进制搜索可以快速查找。但是,插入和删除将涉及大量内存中的副本,例如,在列表前面插入将移动所有元素。

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

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

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

如果您决定编写自己的双比较器,则需要注意以下几点

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


第二个棘手的问题是比较器对对象进行操作,这意味着您将使用双精度而不是双精度。以下四个操作导致将Double解除绑定为Double:=。以下两个不会导致取消装箱:==和!=。这两个操作符执行对象内存指针比较。底线,在执行比较之前,手动将双精度解装箱为双精度;这将大大减少bug。

顺便说一句,在编写“相同的双精度值被认为是相同的”时要小心。浮点数相等的概念是一个非常广泛的主题。您可能需要编写一个自定义比较器,并考虑误差。上面的
j
来自何处?您可以搜索最小值
jSo
j
在一个外部循环中(围绕所示循环),如下所示:
for(int j=0;j
?另外,通过
list[j:i]
您是否使用类似python的语法来指示范围?什么时候可以合并?这个首要问题可能会让我提出另一种结构。