我正在学习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 ***/
}
答案 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(对象命名开始为大写字母)