如何使用Collections比较方法

时间:2015-12-30 11:02:59

标签: java

我使用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

4 个答案:

答案 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>