在Java中创建Set的子集

时间:2012-10-18 19:24:05

标签: java set subset linkedhashset

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

还看了一下谷歌的番石榴图书馆,但看不到我想要的东西。

6 个答案:

答案 0 :(得分:36)

在番石榴:

Set<Integer> subset = ImmutableSet.copyOf(Iterables.limit(set, 20));

请注意,Iterables.limit()会被懒惰地评估,因此只会创建一个额外的集合。

答案 1 :(得分:18)

你可以这样做:

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

答案 2 :(得分:15)

使用Java 8中的流和收集器的解决方案:

Set<Integer> subSet = set.stream()
    .limit(20)
    .collect(toCollection(LinkedHashSet::new));
    // You could also collect to something else 
    // with another collector like this: 
    // .collect(toList());

这假定以下导入:

import static java.util.stream.Collectors.toCollection;

答案 3 :(得分:13)

在Java 8中,你可以做到

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

答案 4 :(得分:5)

您可以先使用SortedSet作为subSet方法。

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

否则你应该继续迭代Set,因为它会更有效率。

答案 5 :(得分:2)

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

public static <T> List<T> listOf(final Collection<T> set, final int limit) {
    final List<T> list = new ArrayList<>(limit);

    final Iterator<T> i = set.iterator();
    for (int j = 0; j < limit && i.hasNext(); j++) {
        list.add(i.next());
    }

    return list;
}