我有NavigableSet
,我希望获得它的中值对象。从NavigableSet获取特定索引处的元素
因为它是一个NavigableSet
,我知道它是排序的,因此我知道它的中间值是中间元素或两个中间元素的算术中间值。
因此,我想访问set.size()/2
的元素,但NavigableSet
接口不允许我。
有没有一种简单的方法来获取特定的元素,而无需手动迭代设置?
我有NavigableSet
,我希望获得它的中值对象。从NavigableSet获取特定索引处的元素
因为它是一个NavigableSet
,我知道它是排序的,因此我知道它的中间值是中间元素或两个中间元素的算术中间值。
因此,我想访问set.size()/2
的元素,但NavigableSet
接口不允许我。
有没有一种简单的方法来获取特定的元素,而无需手动迭代设置?
是的设置不允许你从一个特定的索引获取元素。但是我认为如果你将它转换为数组,那么你将能够实现你所需要的。我试过此示例代码,看看是否有帮助:
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
字符串按字母顺序排列,看看这个小例子:
编辑:现在真的做你想要的。
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
我没有做任何基准测试与更大的数据集,但我想它应该执行相当不错。方法应该直接指向树中的下一个元素。
对不起,但我不明白这与我的问题有什么关系。 –
你是对的,我建议的只是另一种方式:查找集合中某个对象的索引。我很抱歉。 –
将它转换为数组是一个比遍历它更昂贵的操作,所以我不会选择这个解决方案。 –