我正在尝试学习java中的比较器,我在网上找到了这个很好的例子,我的问题是如何改变这个代码,使宠物的名字按年龄和降序排序,最大的在前,最小的在后?
class Dog implements Comparator<Dog>, Comparable<Dog>{
private String name;
private int age;
Dog(){
}
Dog(String n, int a){
name = n;
age = a;
}
public String getDogName(){
return name;
}
public int getDogAge(){
return age;
}
// Overriding the compareTo method
public int compareTo(Dog d){
return (this.name).compareTo(d.name);
}
// Overriding the compare method to sort the age
public int compare(Dog d, Dog d1){
return d.age - d1.age;
}
}
public class Example{
public static void main(String args[]){
// Takes a list o Dog objects
List<Dog> list = new ArrayList<Dog>();
list.add(new Dog("Shaggy",3));
list.add(new Dog("Lacy",2));
list.add(new Dog("Roger",10));
list.add(new Dog("Tommy",4));
list.add(new Dog("Tammy",1));
Collections.sort(list);// Sorts the array list
for(Dog a: list)//printing the sorted list of names
System.out.print(a.getDogName() + ", ");
// Sorts the array list using comparator
Collections.sort(list, new Dog());
System.out.println(" ");
for(Dog a: list)//printing the sorted list of ages
System.out.print(a.getDogName() +" : "+
a.getDogAge() + ", ");
}
}
发布于 2015-05-13 15:49:31
public class DogAgeComparator implements Comparator<Dog> {
public int compare(Dog o1, Dog o2) {
return Integer.compare(o1.getAge(), o2.getId());
}
}
发布于 2017-04-19 21:59:22
在Java 8中,您可以使用:
Comparator.comparingInt(Dog::getDogAge).reversed();
发布于 2012-05-23 05:03:26
一种简单的方法是
Comparator<Dog> ageAscendingComp = ...;
Comparator<Dog> ageDescendingComp = Collections.reverseOrder(ageAscendingComp);
// then call the sort method
另外,狗真的不应该实现Comparator
。这意味着你必须做一些奇怪的事情,比如
Collections.sort(myList, new Dog("Rex", 4));
// ^-- why is a new dog being made? What are we even sorting by?!
Collections.sort(myList, myList.get(0));
// ^-- or perhaps more confusingly
相反,您应该将Compartors作为单独的类。
例如:
public class DogAgeComparator implments Comparator<Dog> {
public int compareTo(Dog d1, Dog d2) {
return d1.getAge() - d2.getAge();
}
}
这有一个额外的好处,即您可以使用类名来说明比较器将如何对列表进行排序。例如:
Collections.sort(someDogs, new DogNameComparator());
// now in name ascending order
Collections.sort(someDogs, Collections.reverseOrder(new DogAgeComparator()));
// now in age descending order
你也不应该让Dog实现Comparable
。Comparable
接口用于表示存在某种固有的、自然的方式来对这些对象进行排序(例如对数字和字符串进行排序)。现在,这不是狗对象的情况,因为有时您可能希望按年龄排序,有时您可能希望按名称排序。
https://stackoverflow.com/questions/10709803
复制相似问题