Sort ArrayList objects using a comparator

I am currently getting an error while trying to sort these Pet objects by weight. I am sure this is something simple, but I do not understand why this comparison does not work.

Error: return type is incompatible with java.util.Comparator.compare (Pet, Pet)

Class 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(); } } 

Class pet

 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(); } }; } 
+5
source share
3 answers

compare method of the Comparator interface returns int , not double .

Edit:

 public double compare(Pet pet1, Pet pet2) 

in

 public int compare(Pet pet1, Pet pet2) 

The comparator might look like this:

 public static Comparator<Pet> SortByWeight = new Comparator<Pet>() { public int compare(Pet pet1, Pet pet2) { return (int)(pet1.getWeight() - pet2.getWeight()); } }; 
+7
source

The compare problem should return an integer corresponding to this Comparator interface.

You can opt out of int in comparison, or maybe better, just use Double.compare () .

Side note: using the @Override annotation in these situations (implementing common interfaces) will cause the compiler to help you see these problems earlier.

0
source

Try the following:

 public int compare(Pet pet1, Pet pet2) { return new Double(pet1.getWeight()).compareTo(new Double(pet2.getWeight())); } 
0
source

All Articles