在Java 8中反转比较器

Guf*_*oru 44 java sorting comparator java-8 java-stream

我有一个ArrayList,并希望按降序排序.我用它来做法java.util.stream.Stream.sorted(Comparator).这是根据Java API的描述:

返回由此流的元素组成的流,并根据提供的内容进行排序Comparator.

这个方法给我一个升序排序.我应该更改哪个参数,只是为了降序?

Tun*_*aki 96

您可以使用Comparator.reverseOrder()比较器强加自然顺序的反转.

如果要反转现有比较器的顺序,可以使用Comparator.reversed().

示例代码:

Stream.of(1, 4, 2, 5)
    .sorted(Comparator.reverseOrder()); 
    // stream is now [5, 4, 2, 1]

Stream.of("foo", "test", "a")
    .sorted(Comparator.comparingInt(String::length).reversed()); 
    // stream is now [test, foo, a], sorted by descending length
Run Code Online (Sandbox Code Playgroud)

  • 你能告诉我为什么这在我的 IDE 中不起作用吗?该行看起来像这样:`.sorted(Comparator.comparing(Map.Entry::getValue).reversed())`。由于某种原因,IDE 开始在 `comparing()` 的相同参数下划线(当我没有调用 `reversed()` 时它没有),并表示“不能从静态上下文引用非静态方法” (6认同)

小智 22

也可以使用Comparator.comparing(Function, Comparator)
必要时链式比较器很方便,例如:

Comparator<SomeEntity> ENTITY_COMPARATOR = comparing(SomeEntity::getProperty1, reverseOrder())
        .thenComparingInt(SomeEntity::getProperty2)
        .thenComparing(SomeEntity::getProperty3, reverseOrder());
Run Code Online (Sandbox Code Playgroud)

  • 如果您要对多个属性进行排序,并且只想反转其中的一些属性,则此示例非常有用! (3认同)
  • 比较器&lt;SomeEntity&gt; ENTITY_COMPARATOR = Comparator.comparing(SomeEntity::getProperty1,reverseOrder()) (2认同)

小智 5

我发现这个问题搜索当你有一个自定义比较器时反转顺序并且反转是有条件的(你可以做或不做)。

匹诺曹提出的想法对我很有帮助。

所以这是代码:

int order = requestedOrder.equals("asc") ? 1 : -1;

Collections.sort(List<CustomObj>, new Comparator<CustomObj>() {
    public int compare(CustomObj first, CustomObj scnd) {
        return first.getComparableParam().compareTo(scnd.getComparableParam()) * order;
    }
});
Run Code Online (Sandbox Code Playgroud)

希望它将来能帮助别人