2012-06-18 23 views
1

我有一個有序的,唯一的一組對象。我目前使用TreeSet來獲得正確的排序。但是,集合不具備獲取索引的能力。是否有一個Java集合的對象是唯一的(如集合中),但能夠獲取某個對象的索引/位置(如列表中所示)?

我目前的實施很好,但不一定直觀。

TreeSet<T> treeSet = new TreeSet<T>(Comparable c); 
// Omitted: Add items to treeSet // 
int index = new ArrayList<T>(treeSet)().indexOf(object); 

有沒有更簡單的方法來做到這一點?

回答

1

treeSet.headSet(object).size()應該做的伎倆:

import java.util.SortedSet; 
import java.util.TreeSet; 

class Test { 

    public static void main(String[] args) { 

    SortedSet<String> treeSet = new TreeSet<String>(); 
    String first = "index 0"; 
    String second = "index 1"; 
    treeSet.add(first); 
    treeSet.add(second); 

    int one = treeSet.headSet(second).size(); 

    System.out.println(one); 
    // 1 
    } 
} 
+0

這確實有效。不幸的是,它並不比手動迭代樹更快--Java並沒有緩存子樹的大小,所以它的O(n)代替了O(log n),因爲它可能是。 –

0

Java沒有這樣的事情。這裏有一些建議,你可以做什麼:

  1. 離開它,因爲它是,因爲這不是那麼糟糕,因爲它可能是;)
  2. 使用一個迭代走線槽的元素
  3. 寫包裝類,它擴展TreeSet並添加獲取功能。
  4. 結帳Guava,看看他們是否有這樣的事情(我沒有使用過,所以我不能告訴,對不起!)
  5. 創建一個數組Object[] arrayView = mySet.toArray();,然後從那個元素(這是有點傻在性能和內存方面)
1

我也面臨着在一個TreeMap的某個位置找到元素的問題。我使用權重來增強樹,以便通過索引訪問元素並在索引處查找元素。 該項目被稱爲索引樹圖http://code.google.com/p/indexed-tree-map/。在有序映射的索引中查找元素或元素索引的實現不是基於線性迭代,而是基於樹二叉搜索。更新樹的權重也基於將樹爬到根上。所以沒有線性迭代。

相關問題