java - 在 Java 中使用 Comparator 时无法编译的源代码

标签 java comparator

尝试运行这个小程序时出现以下错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at MainClass.main(Person.java:120)
Caused by: java.lang.RuntimeException: Uncompilable source code - FirstNameComparator is not abstract and does not override abstract method compare(java.lang.Object,java.lang.Object) in java.util.Comparator
    at FirstNameComparator.<clinit>(Person.java:71)
    ... 1 more
Java Result: 1

请告诉我我哪里做错了,当然这对解释如何正确使用 ComparatorComparable 有帮助。

import java.util.*;
import java.lang.*;

public class Person implements Comparable {

    private String firstName;
    private String lastName;
    private int age;

    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName= lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setAge(int age) {
        this.age=age;
    }
    public int getAge() {
        return age;
    }

    @Override
    public int compareTo(Object anotherPerson) throws ClassCastException {
        if(!(anotherPerson instanceof Person)) {
            throw new ClassCastException("A person object expected !");
        }
        int anotherPersonAge = ((Person)anotherPerson).getAge();
        return this.age = anotherPersonAge;
    }

}

姓氏比较器.java

class LastNameComparator implements Comparator  {

    public int compareTo(Object person, Object AnotherPerson)  {
        String lastName1 = ((Person)person).getLastName().toUpperCase();
        String firstName1= ((Person)person).getFirstName().toUpperCase();
        String lastName2 = ((Person)person).getLastName().toUpperCase();
        String firstName2 = ((Person)person).getFirstName().toUpperCase();

        if(lastName1.equals(lastName2)) {
            return firstName1.compareTo(firstName2);

        }else {
           return lastName1.compareTo(lastName2);

        }
    }

    }   

名字比较器.java

class FirstNameComparator implements Comparator {

    public int compareTo(Object person, Object anotherPerson) {

        String lastName1 = ((Person)person).getLastName().toUpperCase();
        String firstName1 = ((Person)person).getFirstName().toUpperCase();
        String lastName2 = ((Person) person).getLastName().toUpperCase();
        String firstName2 = ((Person) person).getFirstName().toUpperCase();

        if(firstName1.equals(lastName1)) {
            return lastName1.compareTo(lastName2); 

        }else {
            return firstName1.compareTo(firstName2);
        }

    }
}

主类.java

class MainClass  {

    public static void main(String[] args) {

        Person[] persons = new Person[4];
        persons[0] = new Person();
        persons[0].setFirstName("Asaftei");
        persons[0].setLastName("Ionut");
        persons[0].setAge(25);

        persons[1] = new Person();
        persons[1].setFirstName("Binoclu");
        persons[1].setLastName("Telescop");
        persons[1].setAge(10);

        persons[2] = new Person();
        persons[2].setFirstName("Morcov");
        persons[2].setLastName("Castravete");
        persons[2].setAge(33);

        persons[3] = new Person();
        persons[3].setFirstName("Rosie");
        persons[3].setLastName("Ardei");
        persons[3].setAge(55);

        System.out.println("Natural Order : ");
        for(int counter =0; counter<=3; counter++)  {
            Person person = persons[counter];
            String lastName=person.getLastName();
            String firstName=person.getFirstName();
            int age = person.getAge();
            System.out.println(lastName+ ", " +firstName+ " , "+age);
        }

        Arrays.sort(persons, new FirstNameComparator());
        System.out.println();
        System.out.println("Sorted by First Name: ");
        for(int counter=0; counter<=3; counter++) {
            Person person = persons[counter];
            String lastName = person.getLastName();
            String firstName = person.getFirstName();
            int age = person.getAge();

            System.out.println(lastName+ ", " +firstName+ ", " +age );
        }
        Arrays.sort(persons, new LastNameComparator());
        System.out.println();
        System.out.println("Sorted by Last Name");        for(int counter=0; counter<=3; counter++) {
            Person person = persons[counter];
            String lastName = person.getLastName().toUpperCase();
            String firstName = person.getFirstName().toUpperCase();
            int age = person.getAge();
            System.out.println(lastName +", "+firstName+", "+age);
        }
    }
}

最佳答案

Comparator我们需要实现 compare方法,而不是 compareTo 方法。

因此,例如,您的 FirstNameComparator 应该如下所示:

class FirstNameComparator implements Comparator {

    @Override
    public int compare(Object person, Object anotherPerson) {
        // implementation
    }
}

请注意,由于此 Comparator 用于比较 Person 实例,因此使用泛型语法并将其定义为更好的做法:

class FirstNameComparator implements Comparator<Person> {

    @Override
    public int compare(Person person, Person anotherPerson) {
        // implementation
    }
}

关于java - 在 Java 中使用 Comparator 时无法编译的源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31495724/

相关文章:

java - 如何在 JPanel 数组中使用 JCheckbox 数组

java - 实现两个接口(interface)的变量

java - 无法获取 MimeMessage 的 message_ID

C++ 字符串像人一样排序?

java - 不要将文本显示与设置的文本连接起来,而是使用 android 资源?

Java日期,字符串转换为日期对象

java - 按自定义顺序对对象的 ArrayList 进行排序

java - 使用自定义排序功能实现 Treeset

java - 使用完全自定义的多个规则对字符串列表进行排序

java - Collections.sort 不适用于自定义比较器?