web-dev-qa-db-ja.com

Javaでのセットのサブセットの作成

LinkedHashSet、つまり順序​​付きセットがあります。セットのサブセット、つまりセットの最初の20要素を返すだけの関数を見つけようとしています。新しいセットを作成し、最初のセットの反復を使用してデータを入力することでそれができることは知っていますが、もっと簡潔なものを期待していました。

また、GoogleのGuavaライブラリを調べましたが、私が望んでいたものを見ることができませんでした。

29
Paul Taylor

グアバで:

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

Iterables.limit()は遅延評価されるため、追加のコレクションが1つだけ作成されることに注意してください。

36

これを行うことができます:

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

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;
16
Lii

Java 8でできること

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

SortedSet メソッドが存在するため、最初にsubSetを使用できます。

セットのコンテンツをListに追加し、subListメソッドを使用することもできます。ただし、膨大な量のデータを複製したくないので、Setに保存されているデータの量に依存します。

それ以外の場合は、Setのほうが効率的であるため、Setの反復を続ける必要があります。

5
Alex

シンプルなヘルパーメソッド(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;
}
2
user1079877