是否有一个数据结构能够获得用Java实现的N个最大元素的集合?

是否有一个数据结构能够获得用Java实现的N个最大元素的集合?,java,data-structures,treeset,Java,Data Structures,Treeset,java中的TreeSet数据结构提供了获取1个最大元素的能力。我需要的数据结构,允许获得N个最大元素的集合 我需要这样的smth: 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); grea

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

我需要这样的smth:

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}
GreatestN-greest=新的GreatestN(Arrays.asList(5,2,1,7));
最伟大的。getN(2);//返回{1,2}
最伟大的。getN(3);//返回{1,2,5}
添加(0);
最伟大的。getN(2);//返回{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.
List=Arrays.asList(5,2,1,7);
集合。排序(最大);//默认情况下,按升序排序
System.out.println(最大的.get(最大的.size()-1))//将为您提供列表中最重要的元素。
//System.out.println(最大的.get(最大的.size()-1-nthNumber));
System.out.println(最大.get(0))//将为您提供列表中最低的元素。

TreeSet
有一些方法可以根据元素的值(
头戴式耳机
尾套
)而不是索引来获取子集。对于基于索引的方法,您需要使用
列表
子列表()

List-List=Arrays.asList(5,2,1,7);
list.sort();
列表topFive=列表。子列表(0,5);

我无法在线找到您的问题的解决方案,因此我编写了一个

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

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

    }

}
public类GreatestN{
私人名单;
公共大名单(新名单){
this.list=newList;
集合。排序(列表);
}
公共列表getN(整数){
List returnList=new ArrayList();
如果(数字>列表.size()){
数字=list.size();
}
对于(int i=0;i
感谢所有的回答和评论,特别是shmosel的回答和评论:


您可以从
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;
    }
}
public类TreeSetMy扩展TreeSet{
公共阵列列表getFirstN(int n){
如果(n>this.size()){
n=此.size();
}
ArrayList firstN=新的ArrayList(n);
迭代器iter=this.Iterator();
对于(int i=0;i
您可以对数据结构进行排序,从中获取一个
迭代器,然后获取所需的元素数量。请记住按降序排序。当然我可以:)但是如果数据结构(我要求的)存在,我认为最好使用它。您可以从
树集
获得降序迭代器。谢谢,但是您的解决方案时间复杂度太高。它在每个get请求之前对整个列表进行排序。所以复杂性是
O(m*log(m)),其中m=list.size()
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;
    }
}