java的比较,如何通过整数排序?(java comparator, how to sort by

2019-06-24 17:04发布

我试着去学习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() + ", ");
}
}

Answer 1:

简单地改变

public int compare(Dog d, Dog d1) {
  return d.age - d1.age;
}

public int compare(Dog d, Dog d1) {
  return d1.age - d.age;
}

应该在年龄相反的顺序进行排序,如果这是你在找什么。

更新:

@Arian就在他的评论中,声明一个比较的狗那么,您可以声明其作为类本身就是一个公共静态最终场的接受方式之一。

class Dog implements Comparable<Dog> {
    private String name;
    private int age;

    public static final Comparator<Dog> DESCENDING_COMPARATOR = new Comparator<Dog>() {
        // Overriding the compare method to sort the age
        public int compare(Dog d, Dog d1) {
            return d.age - d1.age;
        }
    };

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

}

然后,您可以使用它的任何地方在你的代码,你想如下比较犬:

// Sorts the array list using comparator
Collections.sort(list, Dog.DESCENDING_COMPARATOR);

另外要记住重要的事情时,实施可比的是,它是非常重要的的compareTo与equals一致执行。 虽然不是必需的,不这样做可能会导致一些藏品奇怪的行为,如设置的一些实现。 见这个职位上实现的compareTo的发声原理的更多信息。

更新2:克里斯是正确的,这个代码是容易溢出了年龄较大的负值。 正确的方法来实现这个Java 7中和了将Integer.compare(d.age, d1.age)代替d.age - d1.age

更新3:使用Java 8,你的比较可以更简洁的写了很多:

public static final Comparator<Dog> DESCENDING_COMPARATOR = 
    Comparator.comparing(Dog::getDogAge).reversed();

对于语法Collections.sort保持不变,但compare可以写成

public int compare(Dog d, Dog d1) {
    return DESCENDING_COMPARATOR.compare(d, d1);
}


Answer 2:

只需更换:

return d.age - d1.age;

通过:

return ((Integer)d.age).compareTo(d1.age);

或反转扭转列表:

return ((Integer)d1.age).compareTo(d.age);

编辑:

修正了“内存问题”。
事实上,更好的解决办法是改变age在外地DogInteger ,因为有很多好处,像null可能性...



Answer 3:

public class DogAgeComparator implements Comparator<Dog> {
    public int compare(Dog o1, Dog o2) {
        return Integer.compare(o1.getAge(), o2.getId());
    }
}


Answer 4:

从Java 8,你可以使用:

Comparator.comparingInt(Dog::getDogAge).reversed();


Answer 5:

一个简单的方法是

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

你也应该不会没有狗实现Comparable 。 的Comparable接口被用于表示有订购这些对象(例如用于数字和字符串)一些固有的和自然的方式。 现在,这是不是狗的情况作为对象,有时你不妨按年龄排序,有时你可能希望以按名称排序。



Answer 6:

如果你有机会到Java 8可比API, Comparable.comparingToInt()可能会使用的。 (见的Java 8可比文档 )。

例如,一个Comparator<Dog>排序Dog实例按年龄降可以用下面的创建:

Comparable.comparingToInt(Dog::getDogAge).reversed();

该函数取一个lambda映射TInteger ,并创建一个上升比较器。 链式函数.reversed()打开的上升比较成下降比较器。

注意:虽然这可能不是大多数Android版本在那里有用的,我碰到这个问题就来了,同时寻找一个非Android的Java应用程序类似的信息。 我想这可能是有用的人在同一个地方,看看有什么我结束了安定在。



文章来源: java comparator, how to sort by integer?