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