簡體   English   中英

Java:用於按此順序對對象進行排序/維護鍵的數據結構?

[英]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包含的o1o2o3 他們的排序順序是

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.

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