簡體   English   中英

使用什么數據結構

[英]What data structure to use

我正在尋找具有以下屬性的數據結構。

  • 存儲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並保持排序。 使用二進制搜索快速查找。 然而,插入和刪除將在內存中涉及大量復制,例如,在列表的前面插入會移動所有元素。

一種解決方案是將排序映射到元組列表:

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

聲明行有點難看,但它會起作用。 之前我曾多次使用地圖列表。 關於它的好處是你可以從列表中刪除項目,只要你的列表都是短的,你的移動數量就會減少。 要遍歷整個結構,您需要創建自己的迭代器,或者調整原始代碼。

如果您決定編寫自己的Double比較器,有幾點需要注意。

首先,浮點平等是一個非常棘手的領域。 默認情況下,當您的代碼在不同的虛擬機中運行時,Java無法確保使用浮點數學,盡管可以使用strictfp關鍵字來完成。 浮點運算中的這種不一致性可能會導致不知道這一點的應用程序出現問題,並在多個彼此通信的虛擬機上運行,​​例如服務器和客戶端通信。

第二個棘手的問題是比較器在對象上運行,這意味着你將使用雙打而不是雙打。 以下四個操作導致Double被取消裝箱為double:<,<=,>和> =。 以下兩個不會導致拆箱:==和!=。 這兩個運算符執行對象存儲器指針比較。 底線,在進行比較之前,將雙打手動打開成雙打; 它將大大減少錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM