35

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

また、GoogleのGuavaライブラリも調べましたが、必要なものが見つかりませんでした。

4

6 に答える 6

40

グアバで:

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

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

于 2012-10-18T19:36:22.253 に答える
23

ストリームとコレクターを使用したソリューション:

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

これは、次のインポートを前提としています。

import static java.util.stream.Collectors.toCollection;
于 2015-11-16T14:41:52.853 に答える
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));
于 2012-10-18T19:30:55.527 に答える
5

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

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

それ以外の場合は、より効率的な Set の反復を使用する必要があります。

于 2012-10-18T19:30:49.017 に答える