【问题标题】:Is there a data structure that has ability to get collection of N greatest elements, implemented in Java?是否有一种数据结构能够收集 N 个最大元素的集合,用 Java 实现?
【发布时间】:2017-02-17 16:47:04
【问题描述】:

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}

【问题讨论】:

  • 您可以对数据结构进行排序,从中获取Iterator,然后获取所需的任意数量的元素。请记住按降序排序。
  • 当然可以:)但是如果存在数据结构(我要问的),我认为最好使用它。
  • 您可以从TreeSet 获取降序迭代器。

标签: java data-structures treeset


【解决方案1】:

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

    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.

【讨论】:

  • 谢谢,但您的解决方案的时间复杂度很高。它在每个获取请求之前对整个列表进行排序。所以复杂度是O( m * log(m) ), where m = list.size()
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    感谢所有回答和 cmets,尤其是 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;
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-02-01
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多