2013-05-29 62 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

你是对的,我建议的只是另一种方式:查找集合中某个对象的索引。我很抱歉。 –