0

2つを結合しCollection<String>、n個のランダムな要素を取得して、それらが格納されている元のコレクションから削除する必要があります。

コレクションに参加するために、私はそれらを繰り返し、次の方法でカスタムマップ構造に保存することを考えました。

  1. 同じキーをn回保存する
  2. 元のコレクションを取得します。

それを行う簡単な方法はありますか?

手伝って頂けますか?

4

3 に答える 3

1

これはどう:

Collection<String> collection1 = new ArrayList<String>();
Collection<String> collection2 = new ArrayList<String>();

List<String> allElements = new ArrayList<String>(collection1);
allElements.addAll(collection2);
Collections.shuffle(allElements);

Random random = new Random();
int n = 10;
List<String> randomResults = new ArrayList<String>(n);
for (int i = 0; i < n && !allElements.isEmpty(); i++) {
  String randomElement = allElements.remove(random.nextInt(allElements.size()));
  randomResults.add(randomElement);
}

collection1.removeAll(randomResults);
collection2.removeAll(randomResults);
于 2013-02-20T15:27:31.940 に答える
0

そのためにマップを使用したいのは興味深いことです。MultiMapGoogle's Guavaたとえば)を使用することをお勧めします。Collectionキーを保持してから、そのキーに属するすべての値を保持できます。したがって、キーは 2 つしかありません (元の に対応Collections)。

Collections別の解決策は、すべてを 3 番目の a に追加することCollectionです (addAll(Collection c)利用可能な方法があります)。重複する値がない場合、反復中に 3 番目のコレクションの特定のアイテムが他の 2 つのコレクションの一部であるかどうかを確認できます。

これらは、質問が求めたことを達成するための一種の初歩的な方法ですが、試してみる価値があります。

これらのポインターが少し役立つことを願っています!

于 2013-02-20T14:15:06.270 に答える
0

次のことはあなたに当てはまりますか?

import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

public class Combiner {
    private static final Random rnd = new Random();

    public static void main(String[] args) {
        Collection<String> boys = Sets.newHashSet("James", "John", "andrew",
                "peter");
        Collection<String> girls = Sets.newHashSet("mary", "jane", "rose",
                "danny");

        // Combine the two
        Iterable<String> humans = Iterables.concat(boys, girls);

        // Get n Random elements from the mix
        int n = 2;
        Collection<String> removed = randomSample4(humans, n);

        // Remove from the original Collections
        Iterables.removeAll(boys, removed);
        Iterables.removeAll(girls, removed);

        // or even
        boys.removeAll(removed);
        girls.removeAll(removed);

        // And now we check if all is well
        System.out.println(boys);
        System.out.println(girls);

    }

    public static <T> Collection<T> randomSample4(Iterable<T> humans, int m) {
        List<T> sample = Lists.newArrayList(humans);
        Set<T> res = new HashSet<T>(m);
        int n = sample.size();
        for (int i = n - m; i < n; i++) {
            int pos = rnd.nextInt(i + 1);
            T item = sample.get(pos);
            if (res.contains(item))
                res.add(sample.get(i));
            else
                res.add(item);
        }
        return res;
    }
}

randomSample4 メソッドは、このブログからコピーされました。

于 2013-02-20T15:04:01.080 に答える