有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

因为它是一个NavigableSet,我知道它是被排序的,因此我知道它的中值要么是中间元素,要么是两个中间元素的算术中间

因此,我想访问set.size() / 2处的元素,但是NavigableSet接口不允许我访问

有没有一种简单的方法可以获得特定的元素而不必手动遍历集合


共 (3) 个答案

  1. # 1 楼答案

    字符串按字母顺序排列,请看以下小示例:

    编辑:现在它真的做到了你想要的

    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. # 2 楼答案

    除了在集合“索引”中迭代多次之外,我找不到其他方法。但是,由于我们知道集合的大小,我们可以通过使用升序和降序迭代将其速度提高到至少一半:

    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;
    }
    
  3. # 3 楼答案

    “是”集不允许您从特定索引获取元素。但是我认为如果你把它转换成一个数组,那么你就能够实现你所需要的。我尝试了以下示例代码,看看是否有帮助:

    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]);
    

    Output: 3