2013-05-29 98 views
0

我有NavigableSet,我希望獲得它的中值對象。從NavigableSet獲取特定索引處的元素

因爲它是一個NavigableSet,我知道它是排序的,因此我知道它的中間值是中間元素或兩個中間元素的算術中間值。

因此,我想訪問set.size()/2的元素,但NavigableSet接口不允許我。

有沒有一種簡單的方法來獲取特定的元素,而無需手動迭代設置?

回答

0

是的設置不允許你從一個特定的索引獲取元素。但是我認爲如果你將它轉換爲數組,那麼你將能夠實現你所需要的。我試過此示例代碼,看看是否有幫助:

NavigableSet set = new TreeSet<Integer>(); 
set.add(new Integer(5)); 
set.add(new Integer(4)); 
set.add(new Integer(3)); 
set.add(new Integer(2)); 
set.add(new Integer(1)); 
Integer medianIndex = set.size()/2; 
System.out.println(set.toArray()[medianIndex]); 

輸出:3

+0

將它轉換爲數組是一個比遍歷它更昂貴的操作,所以我不會選擇這個解決方案。 –

0

字符串按字母順序排列,看看這個小例子:

編輯:現在真的做你想要的。

public static void main(String[] args) { 
    NavigableSet<String> set = new TreeSet<String>(); 
    set.add("gamma"); 
    set.add("alpha"); 
    set.add("beta"); 

    System.out.println(Arrays.toString(set.toArray())); 

    int indexOfGamma = set.headSet("gamma").size(); 

    System.out.println(indexOfGamma); 

    System.out.println(get(set, set.first(), indexOfGamma)); 
} 

public static String get(NavigableSet<String> set, String e, int index) { 
    if (index == 0) { 
     return e; 
    } 
    return get(set, set.higher(e), --index); 
} 

這是輸出:

[alpha, beta, gamma] 
2 
gamma 

我沒有做任何基準測試與更大的數據集,但我想它應該執行相當不錯。方法應該直接指向樹中的下一個元素。

+0

對不起,但我不明白這與我的問題有什麼關係。 –

+1

你是對的,我建議的只是另一種方式:查找集合中某個對象的索引。我很抱歉。 –