我试图找到从集合中从x开始获取n个元素的最优雅的方法。我的结论是使用流(streams):
Set<T> s;
Set<T> subS = s.stream().skip(x).limit(n).collect(Collectors.toSet());
这是做事的最佳方式吗?有什么缺点吗?
使用Guava,Iterables.limit(s,20)
。
Set<T,C> s;
Set<T,C> subS = s.stream().skip(x).limit(n).collect(Collectors.toSet());
什么是Set<T,C>
?一个Set
包含给定类型的元素,那么这两个类型参数应该代表什么意思呢?Set<T>
,您没有定义顺序。在Set
的上下文中,“从x开始的n个元素”没有意义。有一些专门的Set
实现具有顺序,例如排序或保留插入顺序,但由于您的代码没有声明这种先决条件,似乎应该在任意Set
上运行,所以必须被视为不可用。Set
的一部分,您必须首先冻结顺序:Set<T> s;
List<T> frozenOrder=new ArrayList<>(s);
Set
的顺序排列,如果有的话,否则将按照创建ArrayList
时固定的任意顺序排列,之后不会更改。List<T> sub=frozenOrder.subList(x, Math.min(s.size(), x+n));
如果您愿意,您还可以将其转换回一个 Set
:
Set<T> subSet=new HashSet<>(sub);
话虽如此,但按位置指定处理Set
的一部分并不常见。
int n = 0;
Iterator<T> iter = set.iterator();
while (n < 8 && iter.hasNext()) {
T t = iter.next();
list.add(t);
n++;
}
for
循环:for (int n = 0; n < NUMBER && iter.hasNext(); n++)
。 - anonStream
的使用是不错的。我唯一能看到的缺点是不是所有的 Set
实现都是有序的,例如 HashSet
是无序的,但 LinkedHashSet
是有序的。因此,在不同的运行中可能会得到不同的结果集。
LinkedHashSet
。 - tddmonkeyint c = 0;
int n = 50; //Number of elements to get
Iterator<T> iter = set.iterator();
while (c<n && iter.hasNext()) {
T t = iter.next();
list.add(t);
c++;
}
集合本质上不是有序的,所以不能从元素x开始。如果您需要排序的集合,可以使用SortedSet。
我会先将其转换为List,例如
new ArrayList(s).subList(<index of x>, <index of x + n>);
但这可能会对性能产生非常不良的影响。在这种情况下,ArrayList必须被存储以检索下一个子列表,因为没有明确的顺序,而隐含的顺序可能会在下一次调用new ArrayList(s)
时发生更改。
Set
是什么,因为标准的Set
只使用一个泛型类型。 - Pshemo