从NavigableSet获取特定索引处的元素

时间:2013-05-29 12:08:25

标签: java collections set median

我有一个NavigableSet,我想得到它的中间对象。

因为它是NavigableSet,我知道它是有序的,因此我知道它的中位数是中间元素,或两个中间元素的算术中间。

因此我想访问set.size() / 2处的元素,但NavigableSet界面不允许我这样做。

是否有一种简单的方法来获取特定元素而无需手动迭代该集合?

3 个答案:

答案 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;
}