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)
嗯,这是一种方法,但你可能找不到更好的方法.
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)
相关的番石榴功能请求 - 请添加任何详细信息.
| 归档时间: |
|
| 查看次数: |
6135 次 |
| 最近记录: |