具有不可比较值异常的比较器和未知值

Comparator and unknow value with 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:无法比较值:JPY

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

你能做什么:

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

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