Есть ли структура данных, которая может собирать N величайших элементов, реализованных в 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}

4 ответа

Решение

Спасибо за все ответы и комментарии, особенно за шмосель:

Вы можете получить нисходящий итератор из 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;
    }
}

Вы можете отсортировать свой список, а затем передать значение индекса, чтобы получить наибольшее число.

    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 имеет методы для получения подмножеств на основе значения элемента (headSet а также tailSet), но не по индексу. Для индексного подхода вам необходимо использовать List а также subList(),

List<Integer> list = Arrays.asList(5, 2, 1, 7);
list.sort();
List<Integer> topFive = list.subList(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);

    }

}
Другие вопросы по тегам