私はLinkedHashSet
、つまり順序付きセットを持っています。私は、集合の部分集合、つまり集合の最初の20要素を返す関数を見つけようとしています。私は新しいセットを作成し、最初のセットの繰り返しを使用してそれを行うことができますが、私はもっと簡潔なものを望んでいました。Javaのセットのサブセットの作成
GoogleのGuavaライブラリも見ましたが、私が望むものは見えませんでした。
私はLinkedHashSet
、つまり順序付きセットを持っています。私は、集合の部分集合、つまり集合の最初の20要素を返す関数を見つけようとしています。私は新しいセットを作成し、最初のセットの繰り返しを使用してそれを行うことができますが、私はもっと簡潔なものを望んでいました。Javaのセットのサブセットの作成
GoogleのGuavaライブラリも見ましたが、私が望むものは見えませんでした。
subSet
メソッドが存在するため、最初にSortedSet
を使用することができます。
List
にセットの内容を追加し、subList
メソッドを使用することもできます。しかし、膨大な量のデータを複製したくないので、Set
に格納されているデータの量によって異なります。
それ以外の場合は、より効率的になるため、セットの繰り返しを維持する必要があります。
あなたはこれを行うことができます:Iterables.limit()
が遅延評価されているので、一つだけの余分なコレクションが作成されていることを
Set<Integer> subset = ImmutableSet.copyOf(Iterables.limit(set, 20));
注:グアバで
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));
+1のボックスの思考のための+1をしたい。 :) –
あなたは別のSetとArrayListの両方を作成しなければならないという事実を除いて、きれいに見えますが、私はそれで生きることができます。 –
downvoteの理由は何ですか? – Reimeus
シンプルなヘルパーメソッド(設定または任意の他のコレクションのためにそれを使用することができます):Javaの8からのストリームやコレクターを使用して
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;
}
ソリューション:
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では、あなたが行うことができます
youSet.stream()
.skip(start) // the offset
.limit(count) // how many items you want
.collect(Collectors.toSet());
あなたはSortedSet'が、あなたはすでにそれからサブセット取るためのメソッドを持つ '使用できる場合は... –
たSortedSetは無意味です私は彼らの挿入オーダー –