一个用于从Set中获取子列表的衬垫

yeg*_*256 5 java guava apache-commons-collection

是否有一个单行(可能来自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;
}
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*man 18

与番石榴:

return FluentIterable.from(set) 
  .limit(count)
  .toImmutableList();
Run Code Online (Sandbox Code Playgroud)

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


Dir*_*irk 13

(new LinkedList<Object>(mySet)).sublist(0, Math.min(count, mySet.size()))
Run Code Online (Sandbox Code Playgroud)

但是请注意:代码(甚至是原始代码)有点臭,因为集合的迭代顺序取决于所讨论的实际集合实现(它完全未定义HashSet并且TreeSets 的键顺序).因此,它实际上是一个悬而未决的问题,哪些元素成为最终的子列表.


Baz*_*Baz 7

这应该这样做:

return (new LinkedList<T>(set)).subList(0, count);
Run Code Online (Sandbox Code Playgroud)

但要确保,这count不大于set.


Chr*_*s B 5

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

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

使用INTEGER的示例:

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);
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

Before SubSet:
1
2
3
4
5

After SubSet:
3
4
5
Run Code Online (Sandbox Code Playgroud)

或者,如果您不知道元素并希望在两点之间返回元素,则可以使用由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);
}
Run Code Online (Sandbox Code Playgroud)