我正在寻找具有以下属性的数据结构。
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并保持排序。使用二进制搜索快速查找。然而,插入和删除将涉及在存储器中的大量复制,例如,插入列表前面会移动所有元素。
答案 0 :(得分:1)
一种解决方案是将排序映射到元组列表:
SortedMap<Double,List<Tuple<Integer,Integer>>>
声明行有点难看,但它会起作用。之前我曾多次使用地图列表。关于它的好处是你可以从列表中删除项目,只要你的列表都是短的,你的移动数量就会减少。要遍历整个结构,您需要创建自己的迭代器,或者调整原始代码。
答案 1 :(得分:0)
如果您决定编写自己的Double比较器,有几点需要注意。
首先,浮点平等是一个非常棘手的领域。默认情况下,当您的代码在不同的虚拟机中运行时,Java无法确保使用浮点数学,尽管可以使用strictfp关键字来完成。浮点运算中的这种不一致性可能会导致应用程序出现问题,而这些应用程序并不知道这一点,并且可以在多个虚拟机之间进行通信,例如服务器和客户端通信。
第二个棘手的问题是比较器在对象上运行,这意味着你将使用双打而不是双打。以下四个操作导致Double被取消装箱为double:&lt ;,&lt; =,&gt;和&gt; =。以下两个不会导致取消装箱:==和!=。这两个运算符执行对象存储器指针比较。底线,在进行比较之前,将双打手动打开成双打;它将大大减少错误。