5

セットからサブリストを取得するワンライナー (おそらく Guava または Apache Collections から) はありますか。内部的には、次のようにする必要があります。

public <T> List<T> sublist(Set<T> set, int count) {
  Iterator<T> iterator = set.iterator();
  List<T> sublist = new LinkedList<T>();
  int pos = 0;
  while (iterator.hasNext() && pos++ < count) {
    sublist.add(iterator.next());
  }
  return sublist;
}

明らかに、十分な要素がない場合は、できるだけ多くを返す必要があります。

4

6 に答える 6

18

グアバの場合:

return FluentIterable.from(set) 
  .limit(count)
  .toImmutableList();

(また、これらの他のソリューションのほとんどとは対照的に、これは実際にはセット全体を反復することはありません。実際には最初のcount要素を反復してから停止するだけです。)

于 2012-09-19T22:09:14.550 に答える
13
(new LinkedList<Object>(mySet)).sublist(0, Math.min(count, mySet.size()))

ただし、注意してください: コード (元のコードでさえ) は少し臭いです。これは、セットの反復順序が問題の実際のセットの実装に依存するためです (s では完全に定義されておらずHashSet、キーの順序も異なりますTreeSet)。したがって、実際には、どの要素が最終的なサブリストになるかは未解決の問題です。

于 2012-09-19T08:29:07.333 に答える
7

これはそれを行う必要があります:

return (new LinkedList<T>(set)).subList(0, count);

ただしcount、 のサイズよりも大きくないことを確認してsetください。

于 2012-09-19T08:28:58.100 に答える
5

TreeSetを使用して、そのsubSetメソッドを使用できます。

fromElement から toElement までの範囲の要素を持つこのセットの部分のビューを返します。fromElement と toElement が等しい場合、fromExclusive と toExclusive の両方が true でない限り、返されるセットは空です。返されたセットはこのセットによってサポートされているため、返されたセットの変更はこのセットに反映され、その逆も同様です。返されたセットは、このセットがサポートするすべてのオプションのセット操作をサポートします。

整数の使用例:

TreeSet<Integer> t = new TreeSet<Integer>();
t.add(1);
t.add(2);
t.add(3);
t.add(4);
t.add(5);

System.out.println("Before SubSet:");

for(Integer s : t){
    System.out.println(s);
}

System.out.println("\nAfter SubSet:");


for(Integer s : t.subSet(2,false,5,true)){
    System.out.println(s);
}

出力:

Before SubSet:
1
2
3
4
5

After SubSet:
3
4
5

または、要素がわからず、2 点間の要素を返したい場合は、Set で構築された ArrayList を使用し、subListメソッドを使用できます。

System.out.println("\nAfter SubSet:");

t = new TreeSet(new ArrayList(t).subList(2, 5));

for(Integer s : t){
    System.out.println(s);
}
于 2012-09-19T08:29:36.850 に答える
2

これはどうですか

Set<String> s = new HashSet<String>();
// add at least two items to the set 
Set<String> subSet = new HashSet(new ArrayList<String>(s).subList(1, 2));

これは 1 と 2 の間のサブリストになります

于 2012-09-19T08:29:17.683 に答える
0

事前にコピーを作成しなくても、Set(Guavaを使用して)実行できます。

Lists.newLinkedList(Iterables.getFirst(Iterables.partition(mySet, count), ImmutableList.of()))

LinkedListこれは、最初の要素のみ(最大)を含む実際のcount要素であり、より大きなリストのビューではありません。

于 2012-09-19T08:41:05.993 に答える