【问题标题】:Anonymous inner class using Comparable interface使用 Comparable 接口的匿名内部类
【发布时间】:2018-10-06 04:00:09
【问题描述】:

当我尝试使用类似接口创建匿名内部时,出现编译错误。

//Code trying to create treeset using comparable
// compilation error
 TreeSet<String> treeSet5 = new TreeSet<String>(new Comparable<String>() {
        @Override
        public int compareTo(String o) {
            // TODO Auto-generated method stub
            return 0;
        }
    });
  // CE:The constructor TreeSet<String>(new Comparable<String>(){}) is undefined

我知道对于自定义排序我们需要使用比较器,但我很好奇为什么我们不能创建可比较的匿名类。

//Custom sorting: default sorting as String implements comparable
// below code is fine as its working as expected.
    TreeSet<String> treeSet2 = new TreeSet<String>(new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            return o2.compareTo(o1);

        }
    });

【问题讨论】:

  • 它告诉你:“构造函数 TreeSet(new Comparable(){}) 是未定义的”。定义public TreeSet(Comparable&lt;String&gt; comparable) { }
  • 使用 Comparator 而不是 Comparable

标签: java collections comparator icomparable


【解决方案1】:
  1. 可以通过比较两个实体来进行排序。
  2. TreeSet 这样的Sorting Util 类需要Comparator,因为它有两个可以比较的参数。
  3. Comparable 没有足够的信息来比较其他元素。

问:现在你会问Sorting Item实现Comparable时它是如何工作的?

A : 在这种情况下,Sorting Item 是第一个要比较的 Item,其他元素被传递给它的方法 compareTo(String o)

【讨论】:

    【解决方案2】:

    Comparable 用于创建可以与自己进行比较的类。

    Comparator 将与未实现 Comparable 的类一起使用(无论出于何种原因,例如来自第 3 方),或者您希望在不继承它们的情况下将它们与原始 compareTo() 方法进行不同的比较。

    希望这对你有意义。

    这里是详细的例子: https://www.geeksforgeeks.org/comparable-vs-comparator-in-java/

    【讨论】:

      【解决方案3】:

      实际上,当我看到 TreeSet api 时,我就意识到了。

      上面的错误是因为TreeSet不接受Comparable接口作为构造函数参数,它只接受Comparator接口和实现。

      Treeset treeSet=new TreeSet();
      //Creates empty tree set. All objects are inserted according to natural sorting order.
      Treeset treeSet=new TreeSet(Comparator c);
      //Creates empty treeSet object, objects are maintained according to defined Comparator.
      TreeSet treeSet = new TreeSet(Collection c)
      

      【讨论】:

      • 好吧,你在前 15 分钟内得到了评论,javadoc 清楚地告诉你,那里有哪些可能的构造函数。