理解泛型排序的基础知识

时间:2015-04-13 00:05:56

标签: java sorting generics

Stack Overflow上有很多关于排序泛型的问题;但是,我有兴趣以最简单的方式对泛型进行排序:没有嵌套。我在下面的代码是尝试对通用集 - 或列表 - 元素进行排序。

List<E> l = new LinkedList<>(arbSet);
Collections.sort(l);

arbSet只是一组元素:Set<E> arbSet

显然,这是有问题的 - 它不应该起作用。为了确保我知道这一点,Eclipse为我尝试调用.sort提供了以下内容:

  

绑定不匹配:类型集合的通用方法sort(List&lt; T&gt;)不适用于参数(List&lt; E&gt;)。推断的类型E不是有界参数的有效替代&lt; T扩展可比较&lt; ?超级T&gt;&gt;

所以,我做了一些文档咨询,看看sort specifications

因此,我尝试确保sort知道E延伸Comparable

第一行现在看起来像:

List<E extends Comparable<? super E>> l = new LinkedSet<>(arbSet);

现在,Eclipse声明:

  

令牌上的语法错误&#34;扩展&#34;,预期

我错过了什么?我觉得这是一个非常基本的例子,我只是错过了一些东西&#34; palm-to-face&#34;去年秋季。为了进一步简化,所有arbSet元素都是实现Comparable接口的元素。

1 个答案:

答案 0 :(得分:2)

仅当您提供自定义Collections.sort()或您尝试排序的元素实现Comparator界面时,才能使用Comparable。因此,它取决于arbSet中存储的元素。

例如,如果您想创建一个接受集合的方法,并返回一个列表,其中set元素已排序,您可以执行以下操作:

static <E extends Comparable<E>> List<E> sortedListFrom(Set<E> set) {
    List<E> l = new LinkedList<>(set);
    Collections.sort(l);
    return l;
}

编辑:

如果你想在构造函数中执行此操作,您有两个选择:

  1. 在构造函数之前声明类型E。当然,这不会做太多,因为list在构造函数完成后会丢失。

    class Test {
        <E extends Comparable<E>> Test(Set<E> arbSet) {
            List<E> list = new LinkedList<>(arbSet);
            Collections.sort(list);
            System.out.println(list);
        }
    }
    
  2. 在类中声明类型E,以便将结果存储在属性中。

    class Test<E extends Comparable<E>> {
        List<E> list;
    
        Test(Set<E> arbSet) {
            this.list = new ArrayList<>(arbSet);
            Collections.sort(this.list);
            System.out.println(this.list);
        }
    }