Reputation: 117
I'm currently getting an error when attempting to sort these Pet objects by weight. I'm sure it's something simple, but I can't see why this compare isn't working.
Error: The return type is incompatible with java.util.Comparator.compare(Pet, Pet)
ArrayListNoDups class
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();
}
}
Pet class
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();
}
};
}
Upvotes: 5
Views: 653
Reputation: 393821
compare
method of Comparator
interface returns an int
, not double
.
Change:
public double compare(Pet pet1, Pet pet2)
to:
public int compare(Pet pet1, Pet pet2)
The Comparator can look like this:
public static Comparator<Pet> SortByWeight = new Comparator<Pet>() {
public int compare(Pet pet1, Pet pet2) {
return (int)(pet1.getWeight() - pet2.getWeight());
}
};
Upvotes: 7
Reputation: 2599
Try this :
public int compare(Pet pet1, Pet pet2) {
return new Double(pet1.getWeight()).compareTo(new Double(pet2.getWeight()));
}
Upvotes: 0
Reputation: 4185
The problem is compare needs to return an integer to comply with that Comparator
interface.
You could cast down to an int in your comparison, or perhaps better, just use Double.compare().
Side note: using the @Override
annotation in these situations (implementing common interfaces) will make the compiler help you see these problems earlier.
Upvotes: 0