比较器首先对匹配的字符串进行排序,然后使用默认的排序顺序进行排序

时间:2020-04-09 16:58:30

标签: java spring list collections

String currency = EUR;

List<Payment> payments = #has payments, with one field being Currency;

//This is not it:
payments.sort(Comparator.comparing(o -> o.getCurrency().equals(currency));

在我的情况下,我希望所有货币等于变量 currency 的付款都位于列表的顶部,其他订单保持不变。

如果没有什么与变量 currency 相等,则按默认值排序,例如USD。

我知道这可以通过其他方法来完成,但这是一种挑战,有人可以帮我解决我从第一部分开始所缺少的东西吗?

2 个答案:

答案 0 :(得分:1)

您需要具有自定义比较器逻辑,才能首先使用currency = EUR对对象进行排序,然后使用自然排序顺序对其余对象进行排序

List<Payment> list = new ArrayList<>(List.of(new Payment("EUR"),new Payment("EUR"),new Payment("AUS"),new Payment("INR"),new Payment("INR")));



    list.sort((c1,c2)->{

        if (c1.getCurrency().equals("EUR")) {
            return c2.getCurrency().equals("EUR") ? 0 : -1;
        }
        if (c2.getCurrency().equals("EUR")) {
            return 1;
        }
        return c1.getCurrency().compareTo(c2.getCurrency());

    });

    System.out.println(list);  //[Payment [currency=EUR], Payment [currency=EUR], Payment [currency=AUS], Payment [currency=INR], Payment [currency=INR]]

答案 1 :(得分:0)

如果您只是想让排序功能对您有用,那么您的比较器可以为欧元货币返回负值,使其在排序顺序中处于最低位置,并将所有其他位置均等。如果要在欧元货币对象中维持订单,则必须对此进行进一步扩展。

list.sort((o1, o2) -> o1.currency.equals("EUR") ? -1 : 0);