Создание подмножества набора в Java
У меня есть LinkedHashSet
т.е. упорядоченный набор. Я пытаюсь найти функцию, которая просто возвращает подмножество набора, то есть первые 20 элементов набора. Я знаю, что могу сделать это, создав новый набор, а затем заполнив его с помощью итерации первого набора, но я надеялся на что-то более сжатое.
Также взглянул на библиотеки Google Guava, но не увидел, что я хотел.
6 ответов
В гуаве:
Set<Integer> subset = ImmutableSet.copyOf(Iterables.limit(set, 20));
Обратите внимание, что Iterables.limit()
оценивается лениво, поэтому создается только одна дополнительная коллекция.
В Java 8 вы можете сделать
mySet.stream()
.skip(start) // the offset
.limit(count) // how many items you want
.collect(Collectors.toSet());
Решение с использованием потоков и сборщиков из 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;
Вы могли бы сделать это:
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));
Вы можете использовать сначала SortedSet
как subSet
метод существует на это.
Вы также можете добавить содержимое вашего набора в List
и использовать subList
метод на это. Но это зависит от количества данных, хранящихся в вашем Set
как вы не хотели бы дублировать огромный объем данных.
В противном случае вам следует придерживаться итерации по множеству, так как она будет более эффективной.
Простой вспомогательный метод (Вы можете использовать его для 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;
}