LinkedHashSet
、つまり順序付きセットがあります。セットのサブセット、つまりセットの最初の20要素を返すだけの関数を見つけようとしています。新しいセットを作成し、最初のセットの反復を使用してデータを入力することでそれができることは知っていますが、もっと簡潔なものを期待していました。
また、GoogleのGuavaライブラリを調べましたが、私が望んでいたものを見ることができませんでした。
グアバで:
_Set<Integer> subset = ImmutableSet.copyOf(Iterables.limit(set, 20));
_
Iterables.limit()
は遅延評価されるため、追加のコレクションが1つだけ作成されることに注意してください。
これを行うことができます:
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));
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;
Java 8でできること
mySet.stream()
.skip(start) // the offset
.limit(count) // how many items you want
.collect(Collectors.toSet());
SortedSet
メソッドが存在するため、最初にsubSet
を使用できます。
セットのコンテンツをList
に追加し、subList
メソッドを使用することもできます。ただし、膨大な量のデータを複製したくないので、Set
に保存されているデータの量に依存します。
それ以外の場合は、Setのほうが効率的であるため、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;
}