首页 > 解决方案 > 具有 IncomparableValueException 的比较器和未知值

问题描述

我使用这个自定义比较器

List<String> currencies = ImmutableList.of("PLN","EUR","USD","GBP", "CHF");
final Ordering<String> currencyOrdering = Ordering.explicit(currencies);

@Override
public int compare(Account o1, Account o2) {
    return currencyOrdering.compare(o1.getCurrency(),o2.getCurrency());
}

但我有错误

IncomparableValueException:无法比较值:日元

我希望这些未知值在最后是随机的......如果可能,如何在标准Java库中解决它。

标签: javaguava

解决方案


你可以做什么 :

    List<String> currencies = ImmutableList.of("OTHERS", "PLN","EUR","USD","GBP", "CHF");
    final Ordering<String> currencyOrdering = Ordering.explicit(currencies).onResultOf(lang -> currencies.contains(lang) ? lang : "OTHERS");
    System.out.println(currencyOrdering.compare("JPY", "PLN")); # -1
    System.out.println(currencyOrdering.compare("JPY", "TTT")); # 0
    System.out.println(currencyOrdering.compare("CHF", "GBP")); # 1

基本上,如果它们在currencies列表中,我要求 Guava 将语言映射到它们自己的值,否则我只给它们OTHERS列表中的第一个值(所以不在列表中的所有内容都放在列表的开头)

注意:你可以在没有番石榴的情况下做到这一点:

    List<String> currencies = List.of("PLN","EUR","USD","GBP", "CHF");
    Comparator<Object> objectComparator = Comparator.comparingInt(currencies::indexOf);
    System.out.println(objectComparator.compare("JPY", "PLN"));
    System.out.println(objectComparator.compare("JPY", "TTT"));
    System.out.println(objectComparator.compare("CHF", "GBP"));

基本上,我指定项目上的“排名”是它在列表中的位置。不需要其他,因为缺少的元素将具有值-1


推荐阅读