在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());