我使用Comparator
接口对Person
节点变量进行排序,但是我得到了几个编译器错误。我的代码如下:
import java.util.*;
import java.util.ArrayList;
import java.util.ListIterator;
public class ArrayNodeDemo {
public static void main(String args[]) {
ArrayList<Person> lstPerson = new ArrayList<Person>();
Person p1 = new Person();
p1.setPersonId(1);
p1.setPersonName("Tom");
lstPerson.add(p1);
Person p2 = new Person();
p2.setPersonId(2);
p2.setPersonName("Jerry");
lstPerson.add(p2);
System.out.println("sorting by Name...");
Collections.sort(lstPerson,new NameComparator());
Iterator it= lstPerson.iterator();
while (it.hasNext()) {
Person person=(Person)it.next();
System.out.println(person.getPersonId() + " " + person.getPersonName());
}
System.out.println("sorting by Id...");
Collections.sort(lstPerson,new IdComparator());
//Iterator it=lstPerson.iterator();
while (it.hasNext()) {
Person person=(Person)it.next();
System.out.println(person.getPersonId() + " " + person.getPersonName());
}
以下是Id比较器类:
import java.util.*;
class IdComparator implements Comparator {
public int Compare(Person o1, Person o2) {
Person p1 = (Person)o1;
Person p2 = (Person)o2;
if (p1.getPersonId() == p2.getPersonId())
return 0;
else if (p1.getPersonId() > p2.getPersonId())
return 1;
else
return -1;
}
}
这是名称比较器类;
import java.util.*;
class NameComparator implements Comparator {
public int Compare(Person o1, Person o2) {
Person p1 = (Person)o1;
Person p2 = (Person)o2;
return p1.getPersonName().compareTo(p2.getPersonName());
}
}
编译代码时出现以下错误:
./NameComparator.java:3: error: NameComparator is not abstract and does not override abstract method compare(Object,Object) in Comparator
class NameComparator implements Comparator{
^
./IdComparator.java:3: error: IdComparator is not abstract and does not override abstract method compare(Object,Object) in Comparator
class IdComparator implements Comparator{
^
Note: ArrayNodeDemo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors
答案 0 :(得分:2)
方法名称
出错public int Compare(Person o1,Person o2)
应该是
public int compare(Person o1,Person o2)
你需要改变这个
class IdComparator implements Comparator{
到这个
class IdComparator implements Comparator<Person>{
答案 1 :(得分:1)
在实现比较器时尝试使用泛型。
class IdComparator implements Comparator<Person>{
和
class NameComparator implements Comparator<Person>{
目前您使用的是原始类型,没有比较(Person o1,Person o2)方法。只比较(对象o1,对象o2)。
答案 2 :(得分:1)
您的姓名和IdComparator工具会实施“原始”和“#”;类型比较器,即没有类型参数。这意味着他们有效地实施了Comparator<Object>
,因此他们的比较方法应该是compare(Object o1, Object o2)
。
将它们设为implements Comparator<Person>
,在比较方法上方添加@Override并编写“比较”#39; (方法名称)用较小的情况&#39; c&#39;。然后你的比较器正确实现Comparator<T>
并编译你的代码。
另见https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html。
答案 3 :(得分:0)
您需要对方法进行一些修改,
public int compare(Object o1, Object 02)
{
Person p1 = (Person)o1;
Person p2 = (Person)o2;
return p1.getPersonName().compareTo(p2.getPersonName());
}
Comparator的compare方法接受两个Object参数,而您的方法接受两个Person参数,将方法的参数更改为Objects或者(最好)使用泛型Comparator.Generics将为您提供编译时类型checks.eg ,
class IdComparator implements Comparator<Person>