Guava:如何从List和单个元素创建显式排序?

Sea*_*oyd 12 java comparator guava

在Guava中,给定了Collection<E>一个我认识e的类型和元素元素E,我想创建一个首先Ordering<E>排序的自定义,e然后是集合的其余部分.然而,到达那里的方式似乎非常复杂:

Collection<String> values = ImmutableList.of("apples", "oranges", "pears");
String first = "oranges";

List<String> remainingValues = newArrayList(values);  // this
remainingValues.remove(first);                        // seems
Ordering<String> myOrdering =                         // very
    Ordering.explicit(first, remainingValues.toArray( // complicated!
        new String[remainingValues.size()]));         // is there an easier way?
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的事情:

Ordering.explicit(first);
Run Code Online (Sandbox Code Playgroud)

(我希望这可以排序first到开头并保留所有其他元素的顺序,但是文档说生成的Ordering会抛出一个ClassCastException未明确列出的元素.)

或者像这样:

Ordering.explicit(first, values.toArray(/* etc */));
Run Code Online (Sandbox Code Playgroud)

(但这会失败,因为它first会是一个重复的值)

有人能想出一个简洁的方法来做我想做的事吗?

顺便说一句,它不一定是一个Ordering,也可能是Iterable在指定的订单中创建一个变通方法,但同样,这是非常复杂的:

Iterable<String> sorted = Iterables.concat(
                             ImmutableList.of(first),
                             Iterables.filter(values, not(equalTo(first))));
Run Code Online (Sandbox Code Playgroud)

Kev*_*ion 9

嗯,这是一种方法,但你可能找不到更好的方法.

final String special = "oranges";
Collections.sort(
    list,
    new Comparator<String>() {
      public int compare(String left, String right) {
        return ComparisonChain.start()
            .compareTrueFirst(left.equals(special), right.equals(special))
            .compare(left, right)
            .result();
      }
    });
Run Code Online (Sandbox Code Playgroud)

ComparisonChain docs

相关的番石榴功能请求 - 请添加任何详细信息.