我有一个NavigableSet
,我想得到它的中间对象。
因为它是NavigableSet
,我知道它是有序的,因此我知道它的中位数是中间元素,或两个中间元素的算术中间。
因此我想访问set.size() / 2
处的元素,但NavigableSet
界面不允许我这样做。
是否有一种简单的方法来获取特定元素而无需手动迭代该集合?
答案 0 :(得分: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
答案 1 :(得分: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
我没有使用更大的数据集做任何基准测试,但我想它应该表现得相当不错。 higher()
方法应直接指向树中的下一个元素。
答案 2 :(得分:0)
除了迭代设置的“索引”次数之外,我找不到任何方法。但是,由于我们知道集合的大小,因此我们可以通过使用升序和降序迭代将其加速到至少一半:
public static <T> T getInNavigableSetByIndex(NavigableSet<T> set, int index) {
Objects.requireNonNull(set);
final int size = set.size();
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
final boolean descend = index >= size / 2;
final Iterator<T> itr = descend ? set.descendingIterator() : set.iterator();
final int stepCount = descend ? size - index : index + 1;
T object = null;
for (int i = 0; i < stepCount && itr.hasNext(); i++) {
object = itr.next();
}
return object;
}