5

是否有一个单行(可能来自 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;
}

显然,如果没有足够的元素,它必须返回尽可能多的元素。

4

6 回答 6

18

与番石榴:

return FluentIterable.from(set) 
  .limit(count)
  .toImmutableList();

(此外,与大多数其他解决方案相比,这实际上不会遍历整个集合——它实际上只会遍历第一个count元素然后停止。)

于 2012-09-19T22:09:14.550 回答
13
(new LinkedList<Object>(mySet)).sublist(0, Math.min(count, mySet.size()))

但请注意:代码(甚至是您的原始代码)有点臭,因为集合的迭代顺序取决于所讨论的实际集合实现(它完全未定义 inHashSet和 s 的键顺序TreeSet)。所以,这实际上是一个悬而未决的问题,哪些元素进入了最终的子列表。

于 2012-09-19T08:29:07.333 回答
7

这应该这样做:

return (new LinkedList<T>(set)).subList(0, count);

但请确保,它count不大于set.

于 2012-09-19T08:28:58.100 回答
5

您可以使用TreeSet并使用它的subSet方法:

返回此集合的一部分的视图,其元素范围从 fromElement 到 toElement。如果 fromElement 和 toElement 相等,则返回的集合为空,除非 fromExclusive 和 toExclusive 都为真。返回的集合由该集合支持,因此返回集合中的更改会反映在该集合中,反之亦然。返回的集合支持该集合支持的所有可选集合操作。

使用整数的示例:

TreeSet<Integer> t = new TreeSet<Integer>();
t.add(1);
t.add(2);
t.add(3);
t.add(4);
t.add(5);

System.out.println("Before SubSet:");

for(Integer s : t){
    System.out.println(s);
}

System.out.println("\nAfter SubSet:");


for(Integer s : t.subSet(2,false,5,true)){
    System.out.println(s);
}

输出:

Before SubSet:
1
2
3
4
5

After SubSet:
3
4
5

或者,如果您不知道元素并希望返回两点之间的元素,则可以使用由 Set 构造的 ArrayList 并使用subList方法。

System.out.println("\nAfter SubSet:");

t = new TreeSet(new ArrayList(t).subList(2, 5));

for(Integer s : t){
    System.out.println(s);
}
于 2012-09-19T08:29:36.850 回答
2

那这个呢

Set<String> s = new HashSet<String>();
// add at least two items to the set 
Set<String> subSet = new HashSet(new ArrayList<String>(s).subList(1, 2));

这将在 1 和 2 之间进行子列表

于 2012-09-19T08:29:17.683 回答
0

无需事先创建副本Set,您可以(使用番石榴):

Lists.newLinkedList(Iterables.getFirst(Iterables.partition(mySet, count), ImmutableList.of()))

LinkedList它是一个只包含(最多)第一个元素的真实count元素,而不是更大列表上的视图。

于 2012-09-19T08:41:05.993 回答