为了账号安全,请及时绑定邮箱和手机立即绑定

使用比较器降序排序(用户定义的类)

使用比较器降序排序(用户定义的类)

RISEBY 2019-11-11 16:09:30
我想使用比较器按降序对对象进行排序。class Person { private int age;}在这里,我想对一个Person对象数组进行排序。我怎样才能做到这一点?
查看完整描述

3 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

您可以用这种方法来覆盖用户定义的类的降序方法,从而覆盖compare()方法,


Collections.sort(unsortedList,new Comparator<Person>() {

    @Override

    public int compare(Person a, Person b) {

        return b.getName().compareTo(a.getName());

    }

});

或通过使用Collection.reverse()用户Prince在其评论中提到的降序进行排序。


您可以像这样进行升序排序,


Collections.sort(unsortedList,new Comparator<Person>() {

    @Override

    public int compare(Person a, Person b) {

        return a.getName().compareTo(b.getName());

    }

});

我们用简洁的Lambda表达式(从Java 8开始)替换上面的代码:


Collections.sort(personList, (Person a, Person b) -> b.getName().compareTo(a.getName()));

从Java 8开始,List具有sort()方法,该方法将Comparator作为参数(更简洁):


personList.sort((a,b)->b.getName().compareTo(a.getName()));

在这里a,b由lambda表达式推断为Person类型。


查看完整回答
反对 回复 2019-11-11
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我将为人员类创建一个比较器,该比较器可以通过某种排序行为进行参数化。在这里,我可以设置排序顺序,但是可以对其进行修改以允许对其他人员属性进行排序。


public class PersonComparator implements Comparator<Person> {


  public enum SortOrder {ASCENDING, DESCENDING}


  private SortOrder sortOrder;


  public PersonComparator(SortOrder sortOrder) {

    this.sortOrder = sortOrder;

  }


  @Override

  public int compare(Person person1, Person person2) {

    Integer age1 = person1.getAge();

    Integer age2 = person2.getAge();

    int compare = Math.signum(age1.compareTo(age2));


    if (sortOrder == ASCENDING) {

      return compare;

    } else {

      return compare * (-1);

    }

  }

}

(希望它现在可以编译,我手边没有IDE或JDK,编码为“ blind”)


编辑


感谢Thomas,编辑了代码。我不会说Math.signum的用法很好,高效,有效,但是我想提醒一下,compareTo方法可以返回任何整数,并且如果()乘以(-1)将失败。实现返回Integer.MIN_INTEGER ...并且我删除了setter,因为它便宜得足以在需要时构造一个新的PersonComparator。


但是我保留拳击内容,因为它表明我依赖现有的Comparable实现。可以做类似的事情,Comparable<Integer> age1 = new Integer(person1.getAge());但是看起来太难看了。这个想法是要显示一种模式,该模式可以轻松地适应其他“人”属性,例如姓名,生日作为“日期”等等。


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 511 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信