我一直在使用Java SE 8中的Comparator接口进行分析。现在,我很想知道如何使用实现reverseOrder()接口的类使用Comparator<T>方法。我写了一个示例程序来检查一下。

class NaturalOrderString implements Comparator<String>{
    @Override
    public int compare(String o1, String o2) {
        // TODO Auto-generated method stub
        return o1.compareTo(o2);
    }
}

public class App {
  public static void main(String[] args) {
      Comparator<String> mycom= new NaturalOrderString();

      mycom.reverseOrder(); // can't use this
   }
}

因此,现在我应该能够使用与Comparator接口关联的所有方法。但是令人惊讶的是,我输入mycom.,然后没有对reverseOrder()方法的建议。为什么呢NaturalOrderString类实现Comparator<T>

因此,我应该接受mycom对象来访问reverseOrder()方法。是不是

而且,我知道列表的排序是使用自然排序进行的。因此,使用集合类,我可以访问reverseOrder()方法。因此,在我的示例之前,我可以愉快地编写
Collections.reverseOrder(mycom); // that's fine.

但是我的问题是为什么我不能通过实现reverseOrder()的类的对象使用Comparator<T>?而且,由于我们无法访问它,因此Java为什么在reverseOrder()接口中包含Comparator<T>方法?

或者,如果确实有可能通过关于我的代码的 mycom 对象访问reverseOrder(),请举一个例子。

最佳答案

基本上,reverseOrder()方法将返回一个与自然顺序相反的比较器。

首先,根据您的问题,由于reverseOrder()是 static method ,因此您不能像mycom.reverseOrder()那样使用它。您必须使用像Comparot.reverseOrder()。
遵循您的代码。我创建了一个ArrayList来演示和使用Comparator.reverseOrder()

public class App {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    List<String> people= new ArrayList<String>();
    people.add("Sam");
    people.add("Bob");
    people.add("Andrew");
    people.add("Michel");
    people.add("Abe");
    people.add("John");

    Comparator<String> mycom= new NaturalOrderString();

    Collections.sort(people); // this will sort the people array list in natural order

    Collections.sort(people,Comparator.reverseOrder()); // Here's your desired method it will reverse the natural order as documentation.

     }
  }

希望您现在对这个概念很清楚。

07-27 18:01