2つを結合しCollection<String>
、n個のランダムな要素を取得して、それらが格納されている元のコレクションから削除する必要があります。
コレクションに参加するために、私はそれらを繰り返し、次の方法でカスタムマップ構造に保存することを考えました。
- 同じキーをn回保存する
- 元のコレクションを取得します。
それを行う簡単な方法はありますか?
手伝って頂けますか?
2つを結合しCollection<String>
、n個のランダムな要素を取得して、それらが格納されている元のコレクションから削除する必要があります。
コレクションに参加するために、私はそれらを繰り返し、次の方法でカスタムマップ構造に保存することを考えました。
それを行う簡単な方法はありますか?
手伝って頂けますか?
これはどう:
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);
そのためにマップを使用したいのは興味深いことです。MultiMap
(Google's Guava
たとえば)を使用することをお勧めします。Collection
キーを保持してから、そのキーに属するすべての値を保持できます。したがって、キーは 2 つしかありません (元の に対応Collections
)。
Collections
別の解決策は、すべてを 3 番目の a に追加することCollection
です (addAll(Collection c)
利用可能な方法があります)。重複する値がない場合、反復中に 3 番目のコレクションの特定のアイテムが他の 2 つのコレクションの一部であるかどうかを確認できます。
これらは、質問が求めたことを達成するための一種の初歩的な方法ですが、試してみる価値があります。
これらのポインターが少し役立つことを願っています!
次のことはあなたに当てはまりますか?
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 メソッドは、このブログからコピーされました。