Подтвердить что ты не робот

Создание подмножества набора в Java

У меня есть LinkedHashSet, т.е. упорядоченный набор. Я пытаюсь найти функцию, чтобы просто вернуть подмножество набора, то есть первые 20 элементов набора. Я знаю, что могу сделать это, создав новый набор, а затем заполнив его с помощью итерации первого набора, но я надеялся на что-то более сжатое.

Также посмотрел библиотеки Google Guava, но не мог видеть, что я хотел.

4b9b3361

Ответ 1

В Гуаве:

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

Обратите внимание, что Iterables.limit() оценивается лениво, поэтому создается только одна дополнительная коллекция.

Ответ 2

Вы можете сделать это:

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

Ответ 3

Решение, использующее потоки и сборщики из 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;.

Ответ 4

Вы можете сначала использовать SortedSet, поскольку существует subSet.

Вы также можете добавить содержимое своего набора в List и использовать на нем метод subList. Но это зависит от объема данных, хранящихся в вашем Set, поскольку вы не захотите дублировать огромный объем данных.

В противном случае вы должны оставаться с итерацией по набору, так как она будет более эффективной.

Ответ 5

В Java 8 вы можете сделать

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

Ответ 6

Простой вспомогательный метод (вы можете использовать его для 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;
}