是否有一种数据结构能够获取 N 个最大元素的集合,并在 Java 中实现?

Is there a data structure that has ability to get collection of N greatest elements, implemented in Java?

java 中有 TreeSet 数据结构,它提供了获取 1 个最大元素的能力。我需要允许收集 N 个最大元素的数据结构。

我需要这样的东西:

GreatestN<Integer> greatest = new GreatestN<>(Arrays.asList(5, 2, 1, 7));
greatest.getN(2); // returns {1, 2}
greatest.getN(3); // returns {1, 2, 5}

greatest.add(0);
greatest.getN(2); // returns {0, 1}

您可以对您的列表进行排序,然后传递索引值以获得最大的数字。

    List<Integer> greatest = Arrays.asList(5, 2, 1, 7);
    Collections.sort(greatest); // By default sorts ascending 
    System.out.println(greatest.get(greatest.size()-1)); //will give you greatest element in the list.
    //System.out.println(greatest.get(greatest.size()-1-nthNumber));
    System.out.println(greatest.get(0));//will give you lowest element in the list.

TreeSet 具有基于元素值(headSettailSet)而不是索引获取子集的方法。对于基于索引的方法,您需要使用 ListsubList().

List<Integer> list = Arrays.asList(5, 2, 1, 7);
list.sort();
List<Integer> topFive = list.subList(0, 5);

我无法在网上找到解决您的问题的方法,所以我写了一个。

如果您只想使用您提供的代码而不修改它,请将我的代码作为 class 添加到您的项目中。

public class GreatestN <T extends Comparable<T>>{


    private List<T> list;

    public GreatestN(List newList){

        this.list = newList;

        Collections.sort(list);

    }

    public List getN(int numbers){

        List<T> returnList = new ArrayList();

        if(numbers>list.size()){
            numbers = list.size();
        }

        for(int i = 0; i < numbers; i++){

            returnList.add(this.list.get(i));

        }

        return returnList;
    }

    public void add(T t){

        list.add(0,t);

        Collections.sort(list);

    }

}

感谢所有的回答和评论,尤其是 shmosel 的回答和评论:

You can get a descending iterator from a TreeSet.

看起来我要问的结构不存在,但它可以很简单地创建:

public class TreeSetMy<E> extends TreeSet<E> {

    public ArrayList<E> getFirstN(int n) {
        if (n > this.size()) {
            n = this.size();
        }

        ArrayList<E> firstN = new ArrayList<>(n);
        Iterator iter = this.iterator();

        for (int i = 0; i < n; i++) {
            firstN.add((E) iter.next());
        }

        return firstN;
    }
}