我试图找到最优雅的方法从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)
您的代码不起作用.
Run Code Online (Sandbox Code Playgroud)Set<T,C> s; Set<T,C> subS = s.stream().skip(x).limit(n).collect(Collectors.toSet());
什么是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通过位置数处理给定的一部分是相当不寻常的.
您可以迭代 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)
好处是它应该比更通用的解决方案更快。
缺点是它比您建议的更冗长。
| 归档时间: |
|
| 查看次数: |
14271 次 |
| 最近记录: |