在Java中创建集合的子集

在Java中创建集合的子集,java,set,subset,linkedhashset,Java,Set,Subset,Linkedhashset,我有一个LinkedHashSet,即有序集。我试图找到一个函数,只返回集合的一个子集,即集合的前20个元素。我知道我可以通过创建一个新的集合,然后使用第一个集合的迭代来填充,但我希望得到更简洁的东西 还查看了Google的Guava库,但看不到我想要什么。您可以先使用排序集,因为该方法存在于其中 您还可以将集合的内容添加到列表中,并在其上使用子列表方法。但这取决于集合中存储的数据量,因为您不希望复制大量数据 否则,您应该在集合上继续迭代,因为这样会更有效率。您可以这样做: Set<Int

我有一个
LinkedHashSet
,即有序集。我试图找到一个函数,只返回集合的一个子集,即集合的前20个元素。我知道我可以通过创建一个新的集合,然后使用第一个集合的迭代来填充,但我希望得到更简洁的东西


还查看了Google的Guava库,但看不到我想要什么。

您可以先使用
排序集,因为该方法存在于其中

您还可以将集合的内容添加到
列表中
,并在其上使用
子列表
方法。但这取决于
集合中存储的数据量,因为您不希望复制大量数据

否则,您应该在集合上继续迭代,因为这样会更有效率。

您可以这样做:

Set<Integer> set = new LinkedHashSet<>();
for (int i = 0; i < 50; i++) {
   set.add(i);
}

List<Integer> list = new ArrayList<>(set);
Set<Integer> subSet = new LinkedHashSet<>(list.subList(0, 20));
Set Set=newlinkedhashset();
对于(int i=0;i<50;i++){
增加(i);
}
列表=新的ArrayList(集合);
Set subSet=newlinkedhashset(list.subList(0,20));
番石榴:

Set<Integer> subset = ImmutableSet.copyOf(Iterables.limit(set, 20));
Set subset=ImmutableSet.copyOf(Iterables.limit(Set,20));
请注意,
Iterables.limit()
是惰性计算的,因此只创建一个额外的集合。

简单帮助器方法(您可以将其用于集合或任何其他集合):

公共静态列表列表(最终集合集,最终整数限制){
最终列表=新的ArrayList(限制);
final Iterator i=set.Iterator();
对于(int j=0;j
使用流和收集器的解决方案:

Set<Integer> subSet = set.stream()
    // .skip(10) // Use this to get elements later in the stream
    .limit(20)
    .collect(toCollection(LinkedHashSet::new));
    // You could also collect to something else 
    // with another collector like this: 
    // .collect(toList());
在Java8中,您可以

mySet.stream()
   .skip(start) // the offset
   .limit(count) // how many items you want
   .collect(Collectors.toSet());

如果您可以使用
SortedSet
,那么您已经有了一种从中取出子集的方法..SortedSet不好,因为它们的自然顺序不是我想要的,我希望它们的插入顺序看起来整洁,除了您必须创建另一个集合和ArrayList这一事实,但我可以接受。要避免出现
IndexOutOfBoundsException
使用
Math.min(list.size(),20)
作为
子列表的第二个参数
用于动态填充列表。谢谢,我知道在番石榴中有一种方法可以做到这一点。如果我想从索引20-40中获取呢?我想你是指限制()而不是跳过()。
import static java.util.stream.Collectors.toCollection;
mySet.stream()
   .skip(start) // the offset
   .limit(count) // how many items you want
   .collect(Collectors.toSet());