【发布时间】:2012-09-11 12:57:58
【问题描述】:
是否有一个单行(可能来自 Guava 或 Apache Collections)从集合中获取子列表。在内部它应该做这样的事情:
public <T> List<T> sublist(Set<T> set, int count) {
Iterator<T> iterator = set.iterator();
List<T> sublist = new LinkedList<T>();
int pos = 0;
while (iterator.hasNext() && pos++ < count) {
sublist.add(iterator.next());
}
return sublist;
}
显然,如果没有足够的元素,它必须返回尽可能多的元素。
【问题讨论】:
-
如果你想从你的集合中获得
subList,你不应该首先使用Set,因为它的迭代顺序是undefined,你的实现可能会产生不同的结果,具体取决于在...月相。 -
你怎么知道我的
Set中的元素顺序是未定义的? -
来自 Java 集合 API - 请参阅 iterator() description in
Set。Set接口本身对Collection合约没有添加任何关于迭代顺序的内容;另一方面设置实现can order its elements somehow(TreeSet 和 LinkedHashSet 可以)。 -
你怎么知道我的
Set实现没有添加迭代顺序? -
我不知道你的impl,但是在方法签名中没有
YourSet但是Set参数,因此方法可以(你不禁止它)被调用为sublist(new HashSet(Arrays.asList(2,3,1), 2)which 可以产生与sublist(new LinkedHashSet(Arrays.asList(2,3,1), 2)不同的结果。
标签: java guava apache-commons-collection