Есть ли структура данных, которая может собирать 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);
}
}