【问题标题】:Understanding the Basics of Generics Sorting了解泛型排序的基础知识
【发布时间】:2015-04-13 00:05:56
【问题描述】:

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

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

arbSet 只是一组元素:Set&lt;E&gt; arbSet

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

绑定不匹配:Collections 类型的泛型方法 sort(List ) 不适用于参数 (List )。推断的类型 E 不是有界参数 >

所以,我做了一些文档咨询,查看sortspecifications

因此,我尝试确保sort 知道E 扩展Comparable

第一行现在看起来像:

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

现在,Eclipse 状态:

令牌“扩展”的语法错误,预期

我错过了什么?我觉得这是一个非常基本的例子,我只是错过了一些“面对面”的东西。为了进一步简化,所有arbSet 元素都是实现Comparable 接口的元素。

【问题讨论】:

  • 类型参数E声明在哪里?

标签: java sorting generics


【解决方案1】:

仅当您提供自定义Comparator 或您尝试排序的元素实现Comparable 接口时,您才能使用Collections.sort()。所以这取决于arbSet中存储了哪些元素。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2021-04-07
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多