Java:如何从集合中获取n个元素

Dia*_*iaa 13 java set java-8

我试图找到最优雅的方法从x开始从集合中获取n个元素.我总结的是使用流:

Set<T> s;
Set<T> subS = s.stream().skip(x).limit(n).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

这是这样做的最好方法吗?有什么缺点吗?

Jam*_*esB 11

类似于Steve Kuo的回答,但也跳过了前x个元素:

Iterables.limit(Iterables.skip(s, x), n);
Run Code Online (Sandbox Code Playgroud)

番石榴Iterables


Ste*_*Kuo 8

使用番石榴Iterables.limit(s, 20).


Hol*_*ger 5

您的代码不起作用.

Set<T,C> s;
Set<T,C> subS = s.stream().skip(x).limit(n).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

什么是Set<T,C>?A Set包含给定类型的元素,那么两个类型参数应该是什么意思?

此外,如果您有Set<T>,则没有已定义的订单."从x开始的集合中的n个元素"在a的上下文中没有任何意义Set.有一些专门的Set实现有一个订单,例如排序或保留插入顺序,但由于你的代码没有声明这样的先决条件,但似乎应该在任意工作Set,它必须被视为破坏.

如果您想Set根据订单处理一小部分,您必须先冻结订单:

Set<T> s;
List<T> frozenOrder=new ArrayList<>(s);
Run Code Online (Sandbox Code Playgroud)

该列表将有一个订单Set,如果有任何订单,或任意订单,在订单创建时固定,ArrayList之后不会改变.

然后,提取它的片段很容易:

List<T> sub=frozenOrder.subList(x, Math.min(s.size(), x+n));
Run Code Online (Sandbox Code Playgroud)

Set如果您愿意,您也可以将其转换回a :

Set<T> subSet=new HashSet<>(sub);
Run Code Online (Sandbox Code Playgroud)

也就是说,Set通过位置数处理给定的一部分是相当不寻常的.


Iva*_*tyk 2

您可以迭代 set 并收集前 n 个元素:

int n = 0;
Iterator<T> iter = set.iterator();
while (n < 8  && iter.hasNext()) {
 T t = iter.next();
 list.add(t);
 n++;
}
Run Code Online (Sandbox Code Playgroud)

好处是它应该比更通用的解决方案更快。

缺点是它比您建议的更冗长。