Java 从集合中获取子列表的一行程序

Java 从集合中获取子列表的一行程序,java,guava,apache-commons-collection,Java,Guava,Apache Commons Collection,是否有一个从集合中获取子列表的一行程序(可能来自Guava或Apache集合)。在内部,它应该这样做: 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 (iter

是否有一个从集合中获取子列表的一行程序(可能来自Guava或Apache集合)。在内部,它应该这样做:

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;
}
公共列表子列表(集合、整数计数){
迭代器迭代器=set.Iterator();
列表子列表=新建LinkedList();
int pos=0;
while(iterator.hasNext()&&pos++
显然,如果没有足够的元素,它必须返回尽可能多的元素。

这应该可以做到:

return (new LinkedList<T>(set)).subList(0, count);
return(新链接列表(set)).subList(0,count);
但请确保
count
不大于
set

(新链接列表(mySet)).sublist(0,Math.min(count,mySet.size())的大小
(new LinkedList<Object>(mySet)).sublist(0, Math.min(count, mySet.size()))
但请注意:代码(甚至您的原始代码)有点臭,因为集合的迭代顺序取决于所讨论的实际集合实现(它在
HashSet
TreeSet
s中完全没有定义)。所以,这实际上是一个悬而未决的问题,哪些元素会进入最后的子列表。

这是什么

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));
Set s=newhashset();
//向集合中至少添加两项
Set子集=新的HashSet(新的ArrayList.subList(1,2));
这将是介于1和2之间的子列表

您可以使用a并使用它的方法:

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

使用整数的示例:

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
或者,如果不知道元素并希望返回两点之间的元素,则可以使用使用集合构造的ArrayList并使用该方法


无需事先创建
集合的副本,您可以(使用番石榴)执行以下操作:

这是一个真正的
链接列表
,只包含(最多)第一个
计数
元素,而不是更大列表上的视图。

番石榴:

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

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

这与上面解释的要求相反。我不知道元素的值,我只需要得到一些them@yegor256我真的很抱歉。我在末尾添加了一个方法,我认为它可能更符合您的要求?如果您希望从集合中获得
子列表
,首先不应该使用
Set
,因为它的迭代顺序未定义,并且您的实现可能会根据以下情况产生不同的结果。。。月亮的阶段。你怎么知道我的
集合
中元素的顺序是未定义的?来自Java集合API-请参阅。
Set
接口本身所做的操作不会对
Collection
关于迭代顺序的契约添加任何内容;另一方面,Set实现(TreeSet和LinkedHashSet有)。你怎么知道我的
Set
实现没有向它添加迭代顺序?我不知道你的impl,但在方法签名中没有
YourSet
Set
参数,因此方法可以(你不禁止它)作为
子列表调用(新的HashSet(Arrays.asList(2,3,1),2)
可以产生与
子列表不同的结果(新的LinkedHashSet(Arrays.asList(2,3,1),2)
。这个具体的片段将给出
索引自动边界异常
)@Xaerxess啊,是的,你是正确的。让我更新代码示例。谢谢+1新的XXXList(set)'处理集合中的所有元素,Fluentitable不处理。从Guava 3.0开始,可以作为
Iterables.limit(Set,count);
。Simpler API,IMHO。@XtremeBiker:这种方法将其转换为
列表
,我认为这是问题的一部分。
Lists.newLinkedList(Iterables.getFirst(Iterables.partition(mySet, count), ImmutableList.of()))
return FluentIterable.from(set) 
  .limit(count)
  .toImmutableList();