Java 8:惯用于创建Comparator,用于根据List中的索引对对象进行排序

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"之前订购.

Bub*_*tan 9

您可以将结果威胁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)