Guava: jak utworzyć wyraźne zamówienie z listy i jednego elementu?

W Guawa, otrzymałemCollection<E> i elemente typuE wiem, że jest w kolekcji, chciałbym stworzyć niestandardowyOrdering<E> tego rodzajue najpierw, a potem reszta kolekcji. Jednak droga do tego wydaje się bardzo skomplikowana:

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?

Życzę sobie czegoś takiego:

Ordering.explicit(first);

(Chciałbym to posortowaćfirst na początku i zachowuj porządek wszystkich innych elementów, ale doktorzy twierdzą, że wynikające z nich zamówienie rzuciClassCastException dla elementów, które nie są wyraźnie wymienione.)

Lub tak:

Ordering.explicit(first, values.toArray(/* etc */));

(Ale to by się nie powiodło, ponieważfirst byłaby duplikatem wartości)

Czy ktoś może wymyślić zwięzły sposób robienia tego, co chcę?

BTW, to nie musi byćOrdering, może to być także obejście dla tworzeniaIterable w określonym zamówieniu, ale znowu jest to bardzo skomplikowane:

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

questionAnswers(7)

yourAnswerToTheQuestion