Comparable接口如何工作?

时间:2015-11-28 15:11:43

标签: java sorting comparable

我正在学习Java并希望对包含对象的数组进行排序。要做到这一点,我想使用Comparable。我一直遇到一个编译错误,似乎指出我要么没有实现compareTo(我做过)或者Comparator有问题(我现在不想使用它)。我已经在下面列出的一个小程序中隔离了这个问题。非常感谢任何帮助,因为我花了几个小时在网上搜索。

我已经注释掉了一些main代码,因为我真正想做的是创建一个带有接口对象的数组并使用Comparable对其进行排序。我不确定这是否可行,所以我现在正在测试排序类。

package comp_test;

  import java.util.ArrayList;
  import java.util.List;

  public class program {

    public static void main(String[] args) 
    {
        List<root> container = new ArrayList<root> ();

        container.add (new A ("Een"));
  //        container.add (new AA ("twee"));
        container.add (new B ("drie"));
  //        container.add (new AA ("vier"));
        container.add (new A ("en Vijf"));

        for (root r: container)
        {
            r.show ();
        } // for
        List.sort (container); // <=== error
        // The method sort(Comparator) in the type List is not 
        // applicable for the arguments (List<root>
    }

  /*
    public static void main(String[] args) 

    {
        List<Itf> container = new ArrayList<Itf> ();

        container.add (new A ("Een"));
        container.add (new AA ("twee"));
        container.add (new B ("drie"));
        container.add (new AA ("vier"));
        container.add (new A ("en Vijf"));

        for (Itf i: container)
        {
            i.show ();
        } // for
        container.sort ();
    }
  */
  }

  --------------
  package comp_test;

  public interface Itf 
  {
    public void show ();
  }
  ---------------
  package comp_test;

  abstract public class root  implements Itf, Comparable<root> 
  {
    abstract public void show ();
    abstract public String getID ();

    @Override
    public int compareTo (root other) 
    {
        return this.getID ().compareTo (other.getID ());
    } /*** compareTo ***/

  }
  ------------------
  package comp_test;

  public class A extends root  
  {
    private String ID;

    public A (String id) 
    {
        this.ID = id;
    } /*** A ***/

    public String getID ()
    {
        return ID;
    } /*** getID ***/

    @Override
    public void show ()
    {
        System.out.println ("A (" + getID () + "): " + super.toString ());
    } /*** show ***/

  }
  ------------------
  package comp_test;

  public class B extends root 
  {
    private String Name;

    public B (String id)
    {
        this.Name = id;
    } /*** B ***/

    @Override 
    public String getID ()
    {
        return Name;
    } /*** getID ***/

    @Override
    public void show ()
    {
        System.out.println ("B (" + Name + "): " + super.toString ());
    } /*** show ***/

  }

3 个答案:

答案 0 :(得分:2)

您尝试按以下方式调用:

List.sort(container);

每当遇到这样的编译器错误时,您应该查看导致错误的方法的Javadoc。查看List.sort的Javadoc,我们可以看到该方法不是静态的,但您试图像使用它一样使用它。由于该方法不是静态的,因此您需要在要尝试排序的对象上调用它:

container.sort(null);

进一步了解该方法,Javadoc说如果你想使用包含对象的自然顺序(即他们的compareTo方法),那么你应该传递null,而不是比较器(就像我上面所做的那样)。 / p>

顺便说一句,您也可以拨打Collections.sort(container);,但这只是一个包装器,它所做的只是调用container.sort(null)

答案 1 :(得分:1)

而不是

  

List.sort(容器);

你应该使用

Collections.sort (container);

container.sort(new Comparator<root>() {
        @Override
        public int compare(root o1, root o2) {
            return o1.compareTo(o2);
        }
    });

或(使用lambda):

 container.sort((o1, o2) -> o1.compareTo(o2));

或(使用lambda,案例2):

container.sort(root::compareTo);

答案 2 :(得分:1)

你应该用这个:

container.sort()

它将使用填充List

的根元素的compareTo方法

PS:root - &gt; Root(对象命名开始为大写字母)