Java 8中的反向比较器

5w9g7ksd  于 2022-12-17  发布在  Java
关注(0)|答案(6)|浏览(167)

我有一个ArrayList,想按降序排序。我使用java.util.stream.Stream.sorted(Comparator)方法。下面是根据Java API的描述:
返回由此流的元素组成的流,这些元素根据提供的Comparator排序。
这个方法返回了一个升序排序。2我应该改变哪个参数,才能得到降序排序?

gmxoilav

gmxoilav1#

您可以使用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
llew8vvj

llew8vvj2#

您也可以使用比较器.comparing(函数,比较器)
必要时可方便地将比较器链接起来,例如:

Comparator<SomeEntity> ENTITY_COMPARATOR = 
        Comparator.comparing(SomeEntity::getProperty1, Comparator.reverseOrder())
        .thenComparingInt(SomeEntity::getProperty2)
        .thenComparing(SomeEntity::getProperty3, Comparator.reverseOrder());
ssm49v7z

ssm49v7z3#

Java 8 Comparator接口有一个reversed方法:https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#reversed--

gupuwyp2

gupuwyp24#

我发现当你有一个定制的比较器,并且反向是有条件的(你可以做或不做)时,这个问题会被搜索为反向顺序。
匹诺曹提出的想法帮助了我。
代码如下:

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

希望以后能帮到别人

idfiyjo8

idfiyjo85#

为什么不扩展现有的比较器并覆盖super和结果呢?比较器接口的实现不是必需的,但它使发生的事情更清楚。
结果你得到了一个容易重用的类文件,可测试的单元步骤和清晰的javadoc。

public class NorCoperator extends ExistingComperator implements Comparator<MyClass> {
    @Override
    public int compare(MyClass a, MyClass b) throws Exception {
        return super.compare(a, b)*-1;
    }
}
xriantvc

xriantvc6#

如果要使用类字段:

Comparator<ClassA> reversedComparator = Collections.reverseOrder(Comparator.comparing(ClassA::getSomeProperty));

相关问题