【发布时间】:2013-01-18 16:21:36
【问题描述】:
在 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?
我想要的是这样的:
Ordering.explicit(first);
(我希望将first 排序到开头并保留所有其他元素的顺序,但文档说生成的排序将为未明确列出的元素抛出ClassCastException。)
或者像这样:
Ordering.explicit(first, values.toArray(/* etc */));
(但这会失败,因为first 会是重复值)
谁能想出一个简洁的方法来做我想做的事?
顺便说一句,它不一定是Ordering,它也可以是在指定订单中创建Iterable 的解决方法,但同样,这非常复杂:
Iterable<String> sorted = Iterables.concat(
ImmutableList.of(first),
Iterables.filter(values, not(equalTo(first))));
【问题讨论】:
-
在链接的 javaDoc 上,allEqual 下的示例以及 nullsFirst/Last 方法引起了我的注意。我想知道您是否有一个要提取的值的比较器小于其他任何值,链接到假设所有其他值都相等的排序?
-
@Charlie 是的,这可行,但实际上不会比我正在做的事情简单
-
这是真的...但是通用的 itemFirst/itemLast 可能会为番石榴本身提供一个很好的补丁...如果接受然后:
Ordering.allEqual().itemFirst("oranges")将非常简单:-D
标签: java guava comparator