2017-06-25 8 views
2

ここでは、私はちょうどエレガントなソリューションを見つけることができないように見える些細なコーディングタスクです。多分それは日曜日の午後の「愚かさ」のことですが、私はそれを見ていないだけです。このようになりますコンテンツにマップからランダムなキーと値を選ぶ?

1. Map<String, Set<String>> namesForGroup; 

::私が好きな何

1 {"Grp1": {"a", "b", "c", "d"}, 
2 "Grp2": {"e", "f", "g", "h"}} 

がエレガントな方法には

私はグループの名前のセットを表す地図を持っていますそのマップからランダムなKey Valueペアを抽出します。例:

1 ["Grp1", "a"] 
2 ["Grp1", "d"] 
3 ["Grp2", "g"] 
4 ["Grp1", "c"] 
5 ["Grp2", "e"] 

選択された値の強いランダム性または均等分布の要件はありません。私が仕事場で書いた新しい機能のために書いているパフォーマンスベンチマークのためのテストデータを生成しているだけで、おおよその概算が必要です。

おかげ

+0

あなたは明確にすることはできますか? –

+0

私はあなたが答えを受け入れていないことに気付きました。何か問題はありましたか? – Marvin

答えて

1

がセットからランダムな要素を取得するには、リストからランダムな要素を取得するよりも少し複雑ですが、ここではそれがうまくいく方法は次のとおりです。

private static String[] getRandomPair(Map<String, Set<String>> map) { 
    Random random = new Random(); 

    String[] groups = map.keySet().toArray(new String[0]); 
    String randomGroup = groups[random.nextInt(groups.length)]; 

    String[] names = map.get(randomGroup).toArray(new String[0]); 
    String randomName = names[random.nextInt(names.length)]; 

    return new String[] { randomGroup, randomName }; 
} 

サンプル使用:

public static void main(String[] args) { 
    Map<String, Set<String>> namesForGroup = new HashMap<>(); 
    namesForGroup.put("Grp1", new HashSet<>(Arrays.asList("a", "b", "c", "d"))); 
    namesForGroup.put("Grp2", new HashSet<>(Arrays.asList("e", "f", "g", "h"))); 
    System.out.println(Arrays.toString(getRandomPair(namesForGroup))); 
    System.out.println(Arrays.toString(getRandomPair(namesForGroup))); 
    System.out.println(Arrays.toString(getRandomPair(namesForGroup))); 
    System.out.println(Arrays.toString(getRandomPair(namesForGroup))); 
} 

プリント例:

[Grp2, e] 
[Grp1, a] 
[Grp2, e] 
[Grp1, b] 
1

あなたの質問は他のいくつかの複製、一種です。ネストされた方法で2回、セットのランダムな要素を見つける必要があるという点で、重複リンクからはおそらくユニークです。マップのエントリセットからランダムなマップエントリを取得し、そのキーを取得してから、そのエントリの値からランダムな要素を取ります。それ自体は別のセットです。

これを行うには、Setでランダム要素を見つけるヘルパーメソッドを作成すると役に立ちます。これは、セットが本質的にの順序付けされていないので、必要です。。 1つではないので(単に、TreeSetにあるかもしれませんが、これは意味をなさないかもしれませんが、普通のSetにはありません)、インデックスにアクセスすることはできません。

public static <T> T getRandomSetEntry(Set<T> set) { 
    int size = set.size(); 
    int item = new Random().nextInt(size); 
    int i = 0; 
    for (T obj : set) { 
     if (i == item) 
      return obj; 
     i++; 
    } 

    return null; 
} 

public static void main(String args[]) { 
    Map<String, Set<String>> namesForGroup = new HashMap<>(); 
    Set<String> set1 = new HashSet<>(); 
    set1.add("a"); 
    set1.add("b"); 
    set1.add("c"); 
    set1.add("d"); 
    Set<String> set2 = new HashSet<>(); 
    set2.add("e"); 
    set2.add("f"); 
    set2.add("g"); 
    set2.add("h"); 

    namesForGroup.put("Grp1", set1); 
    namesForGroup.put("Grp2", set2); 

    Set<Map.Entry<String, Set<String>>> set = namesForGroup.entrySet(); 
    Map.Entry<String, Set<String>> entry = getRandomSetEntry(set); 
    String key = entry.getKey(); 
    String value = getRandomSetEntry(entry.getValue()); 
    System.out.println("key: " + key + ", value: " + value); 
} 

ここにデモ:あなたが立ち往生している場所を正確に

Rextester

関連する問題