java - 具有 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库中解决它。
解决方案
你可以做什么 :
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
推荐阅读
- reactjs - NextJS:在移动设备上打开应用程序时组件无法正确切换
- firebase - Flutter Firestore:Streambuilder 从不同的用户文档返回数据
- c++ - 尽管编译时间更长,但 C++ 中的仅标头代码是否会导致更快的运行时?
- flutter - 如何将下拉列表行插入数据表?
- flutter - 如何定位半张图片
- javascript - 从嵌套数组中获取值
- javascript - 使用 ngModelChange 重复动态表单
- python - 生成随机密钥
- node.js - 在 dockerfile 上运行脚本以获取节点映像
- azure-pipelines - 跨多个任务共享 azure 管道任务“env”