[英]Java: Data structure for sorting objects/maintaining a key in that order?
我想維護Odp類型的對象的集合。 Odp實現Comparable。 我需要能夠使用其整數名稱引用集合中的對象。 此整數必須與其排序順序(而不是插入順序)相對應。 每個整數僅適用於一個Odp,反之亦然。
我有一個功能compareOdp(Odp o1, Odp o2)
,該函數返回一個表示兩個參數相似性的數值。 我將以這樣一種方式來設置Odp集合,即可以很容易地問到諸如“集合中最接近foo
Odp是什么?”之類的問題。 或“在這幾個Odp對象集合中,它們彼此之間有多近?”
做這個的最好方式是什么? TreeMap的? HashBiMap?
相關問題:
假設我有以下對象集:集合col
包含的o1
, o2
, o3
。 他們的排序順序是
o2
o3
o1
我想問col
:“列表中的第n個對象是什么?” 從我所看到的,SortedSet和TreeMap沒有辦法做到這一點。 我想我可以進行遍歷,但是感覺應該有一種更簡單的方法。
如果您使用的是Java 6,則NavigableSet
API(由TreeSet
實現)可以提供幫助。
public static Odp nearest(Odp o, NavigableSet<? extends Odp> set) {
Odp f = set.floor(o), c = set.ceiling(o);
if (f == null)
return c;
if (c == null)
return f;
int df = compareOdp(o, f), dc = compareOdp(c, o);
return (df <= dc) ? f : c;
}
根據Comparable接口,任何SortedSet的實現都將使項目保持順序。 TreeSet是SortedSet的實現。
就我所使用的而言, TreeMap是一個內置解決方案。 我覺得還不錯。
我會使用低級的LinkedList 。 然后使用Collections.binarySearch搜索列表。 二進制搜索功能將在鏈接列表中返回插入點。 要查找最接近的那個,只需將您的compareOdp函數與鏈表中的以下項目和上方的項目一起使用。
// What is the nth object in the list...
Object oneObject = TreeMap.get(nthKey);
好的,到目前為止/很好。 如果您不關心它們如何包含在數據結構中,則可以使用(可能必須查找它,但將其稱為)HashMap ==,在這種情況下,您將提供一個密鑰,該密鑰可以輕松地是:
Object placement= HashMap.put(new Integer(++index),new Object(data));// see docs for exact
如果placement為null,則映射先前不包含該對象,可以與containsKey()結合使用,從而可以獲得對數據集的精確管理
可以通過有序鍵進行get和put的查找,只有當您執行toArray()
您才能得到一個奇怪的排序,該順序只有編寫HashMap實現的任何人都可以理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.