err*_*ist 2 java list comparator java-8
什么是创造了最地道的方式Comparator<T>
在Java中8定义对象的排序例如,基于在其相对指标给定的List
,但仍然是一个对象在该列表中不存在定义为"后"那些是是列表中?- 如果我只是使用List.indexOf(Object)
,不在列表中的对象将总是在列表中的对象之前,因为-1
对于不在列表中的所有对象返回的事实,这小于任何"真"索引:
final List<String> ordering = Arrays.asList("foo", "bar");
final Comparator<String> orderingComparator = Comparator.comparingInt(ordering::indexOf);
final String str1 = "foo";
final String str2 = "baz";
final String msg;
final int cmp = orderingComparator.compare(str1, str2);
if (cmp < 0) {
msg = String.format("Element \"%s\" is ordered before \"%s\".", str1, str2);
} else if (cmp > 0) {
msg = String.format("Element \"%s\" is ordered after \"%s\".", str1, str2);
} else {
msg = String.format("Element \"%s\" is equal to \"%s\".", str1, str2);
}
System.out.println(msg);
Run Code Online (Sandbox Code Playgroud)
这打印
元素"foo"在"baz"之后排序.
而我希望的行为会打印出来
元素"foo"在"baz"之前订购.
您可以将结果威胁indexOf
为无符号整数.然后-1
是最大值并放在其他值之后.
这可能是最可读的方法(尽管每个索引都被装箱):
Comparator.comparing(ordering::indexOf, Integer::compareUnsigned)
Run Code Online (Sandbox Code Playgroud)
这是一个避免装箱的更快的替代方案:
Comparator.comparingInt(s -> ordering.indexOf(s) + Integer.MIN_VALUE)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
868 次 |
最近记录: |