2012-10-18 4 views
18

私はLinkedHashSet、つまり順序​​付きセットを持っています。私は、集合の部分集合、つまり集合の最初の20要素を返す関数を見つけようとしています。私は新しいセットを作成し、最初のセットの繰り返しを使用してそれを行うことができますが、私はもっと簡潔なものを望んでいました。Javaのセットのサブセットの作成

GoogleのGuavaライブラリも見ましたが、私が望むものは見えませんでした。

+0

あなたはSortedSet'が、あなたはすでにそれからサブセット取るためのメソッドを持つ '使用できる場合は... –

+0

たSortedSetは無意味です私は彼らの挿入オーダー –

答えて

29

を。

+0

グアバでこれを行う方法があると思います。 –

+9

インデックス20-40から取得したい場合はどうすればよいですか? – Dejell

4

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

Listにセットの内容を追加し、subListメソッドを使用することもできます。しかし、膨大な量のデータを複製したくないので、Setに格納されているデータの量によって異なります。

それ以外の場合は、より効率的になるため、セットの繰り返しを維持する必要があります。

15

あなたはこれを行うことができます: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)); 
+4

+1のボックスの思考のための+1をしたい。 :) –

+0

あなたは別のSetとArrayListの両方を作成しなければならないという事実を除いて、きれいに見えますが、私はそれで生きることができます。 –

+0

downvoteの理由は何ですか? – Reimeus

1

シンプルなヘルパーメソッド(設定または任意の他のコレクションのためにそれを使用することができます):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; 
} 
7

ソリューション:

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;を前提としています。彼らの自然な順序は私何がでないよう

+0

あなたはlimit()を意味するskip()を意味しません。 – dnellis74

+1

@ dnellis74:ああ、もちろん、ありがとう、更新されました。 – Lii

2

のJava 8では、あなたが行うことができます

youSet.stream() 
    .skip(start) // the offset 
    .limit(count) // how many items you want 
    .collect(Collectors.toSet()); 
関連する問題