【问题标题】:Sort a list of object w.r.t to a particular member/state in descending order按降序对特定成员/状态的对象列表进行排序
【发布时间】:2011-10-29 14:42:32
【问题描述】:

我有一个包含 4 个成员的 java 对象列表。

int id;
String name;
String age;
int order;

我正在使用他的代码根据 if 条件对对象字段进行升序排序。

Collections.sort(list, new Comparator<com.MyObject>() {

          public int compare(com.MyObject object1, com.MyObject object2) {

            if(myString.equalsIgnoreCase("name")){
            return object1.getName().compareTo(object2.getName());

          }else if(myString.equalsIgnoreCase("age")){
            return object1.getAge().compareTo(object2.getAge());

          }else{
            return object1.getOrder() - object2.getOrder();
          }
      }
  });

我想添加另一个条件if(myString.equalsIgnoreCase("nameReverse")) 如果是这种情况,则列表应按降序排序。

【问题讨论】:

  • 我使用 Collections.sort(list, Collections.reverseOrder());但它会抛出异常。

标签: java list sorting comparator


【解决方案1】:

Collections class 有一个reverseOrder 方法,它为给定的比较器返回一个反向的Comparator。 IMO,如果您只想获得反向 Comparator,则不修改 Comparator 会更干净。

一些示例代码:

public class Person {

    public static void testComparator() {
        Person p1 = new Person("c");
        Person p2 = new Person("a");
        Person p3 = new Person("b");
        List<Person> persons = Arrays.asList(p1, p2, p3);
        Collections.sort(persons, PersonComparator.INSTANCE);
        System.out.println("After normal sorting: " + persons);
        Collections.sort(persons, Collections.reverseOrder(PersonComparator.INSTANCE));
        System.out.println("After reverse sorting: " + persons);
    }

    public Person(String name) { this.name = name; }

    public String name;

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Person [name=").append(name).append("]");
        return builder.toString();
    }

}

class PersonComparator implements Comparator<Person> {

    public static final PersonComparator INSTANCE = new PersonComparator();

    @Override
    public int compare(Person o1, Person o2) {
        return o1.name.compareTo(o2.name);
    }

}

【讨论】:

  • 我使用 Collections.sort(list, Collections.reverseOrder());但它会引发异常。
  • 您需要将原始的Comparator 传递给reverseOrder() 才能使用。
  • 我将此行添加到代码中,但它会引发编译时错误 else codeif(myString.equalsIgnoreCase("nameReverse")){ return Collections.sort(list,Collections.reverseOrder()); code
  • 正如 Sanjay 所说,Collections.reverseOrder 需要一个参数,这可能就是您没有向我们展示的那个异常所说的。
  • 使用新代码 sn-p 更新您的原始帖子。最简单的方法是将原始的 Comparator 存储在一个变量中,并将其传递给Collections.reverse 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多