Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可比较的接口是如何工作的?_Java_Sorting_Comparable - Fatal编程技术网

Java 可比较的接口是如何工作的?

Java 可比较的接口是如何工作的?,java,sorting,comparable,Java,Sorting,Comparable,我正在学习Java,希望对包含对象的数组进行排序。要做到这一点,我想使用Comparable。我总是遇到一个编译错误,似乎指出我要么没有实现compareTo(我实现了),要么Comparator有问题(我现在不想使用)。我在下面列出的一个小程序中隔离了这个问题。非常感谢您的帮助,因为我花了数小时在网上搜索 我已经注释掉了main的一些代码,因为我真正想做的是创建一个带有接口对象的数组,并使用Comparable对其进行排序。我不确定这是否可行,所以我现在正在测试排序类 包装复合试验 imp

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

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

包装复合试验

  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 ***/

  }
import java.util.ArrayList;
导入java.util.List;
公共课程{
公共静态void main(字符串[]args)
{
列表容器=新的ArrayList();
container.add(新的A(“Een”));
//container.add(新AA(“twee”);
container.add(新的B(“drie”);
//container.add(新AA(“vier”);
container.add(新的A(“en-Vijf”);
for(根r:容器)
{
r、 show();
}//为了
List.sort(container);//代替

List.sort(容器)

你应该使用

Collections.sort (container);

或(使用lambda,情况2):

而不是

List.sort(容器)

你应该使用

Collections.sort (container);

或(使用lambda,情况2):

您应该使用以下选项:

container.sort()
它将使用填充列表的根元素的compareTo方法

PS:root-->root(对象命名开始将以大写字母命名)

您应该使用:

container.sort()
它将使用填充列表的根元素的compareTo方法


PS:root-->root(对象命名开始将使用大写字母)

您试图这样调用sort:

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

container.sort(null);
在进一步阅读该方法时,Javadoc说,如果您想使用包含的对象的自然顺序(即它们的compareTo方法),那么应该传递null,而不是comparator(如我前面所做的)


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

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

container.sort(null);
在进一步阅读该方法时,Javadoc说,如果您想使用包含的对象的自然顺序(即它们的compareTo方法),那么应该传递null,而不是comparator(如我前面所做的)


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

请将您的代码编辑为演示问题的最小示例(因此没有注释代码),并确保指定得到的确切错误。要使用
Collections.sort(container)请在代码格式化中考虑一些惯例。例如,类名的首字母,函数名和第一个PARN之间没有空格。@ BHSPANSER -我在哪里可以找到这些约定的列表?原始代码样式指南在很长一段时间内没有被更新,但是大多数人仍然是FoLo。今天与他们见面:还有一个样式检查器,它将检查您的代码并报告与指南的任何偏差,可以在命令行上独立运行,也可以作为IDE插件运行:请编辑您的代码,使其成为演示问题的最小示例(因此没有注释代码),并确保指定得到的确切错误。要使用
Collections.sort(container)请在代码格式化中考虑一些惯例。例如,类名的首字母,函数名和第一个PARN之间没有空格。@ BHSPANSER -我在哪里可以找到这些约定的列表?原始代码样式指南在很长一段时间内没有被更新,但是大多数人仍然是FoLo。今天与他们见面:还有一个样式检查器,它将检查您的代码并报告与准则的任何偏差,可以在命令行上独立运行,也可以作为IDE插件运行:为什么要包括创建冗余比较器的其他选项?@Viacheslav,Collection.sort(container);未编译。错误:类型集合的方法排序(列表)未定义。请不要使用“Collection.sort”,而是使用“Collections.sort”(末尾带有“S”),为什么要包括创建冗余比较器的其他选项?@Viacheslav,Collection.sort(container);未编译。错误:方法排序(列表)对于类型集合未定义。请不要使用“Collection.sort”,而是使用“Collections.sort”(结尾带有“S”)。谢谢!container.sort(null)有效。Collection.sort(container)无效。非常感谢您的详细阐述:-)您拼错了集合(注意复数):-)谢谢!container.sort(null)有效。Collection.sort(container)不需要。非常感谢您的精心设计:-)您拼错了藏品(注意复数):-)