ArrayList使用Comparator对对象进行排序

Jos*_*ray 5 java arraylist

我在尝试按重量对这些Pet对象进行排序时遇到错误.我确信这很简单,但我不明白为什么这个比较不起作用.

错误:返回类型与java.util.Comparator.compare(Pet,Pet)不兼容

ArrayListNoDups类

import java.util.*;
import java.util.Collections;
import java.util.Comparator;
import java.lang.Object;

public class ArrayListNoDups {
    public static void main(String[] args) {
        ArrayList<Pet> list = new ArrayList<Pet>();
        String name;
        Integer age;
        Double weight;
        Scanner keyboard = new Scanner(System.in);
        System.out.println("If you wish to stop adding Pets to the list, please put a 0 for all 3 fields.");

        do {
            System.out.println("Enter a String for Pet name: ");
            name = keyboard.next();
            System.out.println("Enter an int for Pet age: ");
            age = keyboard.nextInt();
            System.out.println("Enter a double for Pet weight: ");
            weight = keyboard.nextDouble();

            if (name.length() > 0 && age > 0 && weight > 0)
                list.add(new Pet(name, age, weight));
        } while (name.length() > 0 && age > 0 && weight > 0);

        System.out.println("Your list sorted by WEIGHT ========================= ");
        Collections.sort(list, Pet.SortByWeight);
        for (Pet p2 : list)
            p2.writeOutput();

    }
}
Run Code Online (Sandbox Code Playgroud)

宠物类

import java.util.*;

public class Pet {
    private String name;
    private Integer age; // in years
    private double weight; // in pounds

    public void writeOutput() {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age + " years");
        System.out.println("Weight: " + weight + " pounds");
    }

    public void set(String newName) {
        name = newName;
        // age and weight are unchanged.
    }

    public void set(int newAge) {
        if (newAge <= 0) {
            System.out.println("Error: illegal age.");
            System.exit(0);
        } else
            age = newAge;
        // name and weight are unchanged.
    }

    public void set(double newWeight) {
        if (newWeight <= 0) {
            System.out.println("Error: illegal weight.");
            System.exit(0);
        } else
            weight = newWeight;
        // name and age are unchanged.
    }

    public Pet(String name, int age, double weight) {
        this.name = name;
        this.age = age;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getWeight() {
        return weight;
    }

    public static Comparator<Pet> SortByWeight = new Comparator<Pet>() {
        public double compare(Pet pet1, Pet pet2) {
            return pet1.getWeight() - pet2.getWeight();
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 7

compareComparator接口的方法返回一个int,而不是double.

更改:

public double compare(Pet pet1, Pet pet2)
Run Code Online (Sandbox Code Playgroud)

至:

public int compare(Pet pet1, Pet pet2)
Run Code Online (Sandbox Code Playgroud)

比较器可以如下所示:

public static Comparator<Pet> SortByWeight = new Comparator<Pet>() {
    public int compare(Pet pet1, Pet pet2) {
        return (int)(pet1.getWeight() - pet2.getWeight());
    }
};
Run Code Online (Sandbox Code Playgroud)

  • @MartDellon请注意,如果您使用Ankit的解决方案,每次比较都将涉及创建两个Double对象,这些对象可立即符合垃圾回收的条件.一个体面的n元素排序算法需要n*log(n)比较,这意味着你将创建2*n*log(n)Double objcets并为垃圾收集器提供额外的工作.这可能会使排序比我的解决方案慢,后者适用于基本类型,不会创建任何对象. (2认同)