0

これが重複している場合はお詫び申し上げますが、この特定の問題に具体的に答える回答は見つかりませんでした。

Set値とペアになった文字列キーを含むHashMapがあります。セットの長さに基づいてマップ内の値を並べ替えたいと思います。検討:

HashMap<String, Set<String>> myMap;

含まれています:

{"A", {"Dukmerriot", "King", "Pumpkin"}}  
{"B", {"Steve"}}
{"C", {"Jib", "Jab", "John", "Julie"}}
{"D", {"Apple", "Amy", "Unicorn", "Charlie", "Raptor"}}
{"E", {}}

効率的にリスト{"D", "C", "A", "B", E"}(セットの大きいものから小さいものへの順序を指定)を取得できるようにしたい。myMap

Setを実装するラッパークラスを作成してメソッドをオーバーライドする以外に、セットのコレクションを長さに基づいて並べ替える方法はありますcompareToか?

編集:このコレクションを維持するためにHashMapを使用する必要がないことを指定する必要があります。TreeMapなどを使用することもできますが、SetはComparableを実装していないため、それが可能かどうかはわかりません。

4

5 に答える 5

6

Setを実装するラッパークラスを作成してcompareToメソッドをオーバーライドする以外に、セットのコレクションを長さに基づいて並べ替える方法はありますか?

それはそれを行うための完全に実行可能な方法です。Comparator:を使用することもできます

List<Set<String>> mySets = new ArrayList<>(myMap.values());
mySets.sort(new Comparator<Set<String>>() {
    @Override
    public int compare(Set<String> a, Set<String> b) {
        return Integer.compare(a.size(), b.size());
    }
});

...しかし、各セットに対応するキーを失いました。それでは、マップエントリを並べ替えてみましょう。

List<Entry<String, Set<String>>> entries = new ArrayList<>(myMap.entrySet());
entries.sort(new Comparator<Entry<String, Set<String>>>() {
    @Override
    public int compare(Entry<String, Set<String>> a,Entry<String, Set<String>> b) {
        return Integer.compare(a.getValue().size(), b.getValue().size());
    }
});

これで、「簡単に」キーを取得できます。

List<String> sortedKeys = new ArrayList<>();
for (Entry<String, Set<String>> e : entries) {
    sortedKeys = e.getKey();
}

このリストはキーのライブビューではありませんが、それが許容できる制限である場合は最善の策になります。

于 2013-02-25T20:58:22.747 に答える
2
final Map<String, Set<String>> map = new HashMap<>();

map.put("A", ImmutableSet.of("Dukmerriot", "King", "Pumpkin"));
map.put("B", ImmutableSet.of("Steve"));
map.put("C", ImmutableSet.of("Jib", "Jab", "John", "Julie"));
map.put("D", ImmutableSet.of("Apple", "Amy", "Unicorn", "Charlie", "Raptor"));
map.put("E", new HashSet<String>());

List<String> keys = new ArrayList<>(map.keySet());
Collections.sort(keys, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {
        return Integer.valueOf(map.get(o2).size()).compareTo(map.get(o1).size());
    }
});

for (String key : keys) {
    System.out.println(key);
}

プリント

D
C
A
B
E

コードを短くするために、GoogleGuavaのImmutableSetを使用しました。あなたはそれが役に立つと思うかもしれないのであなたは彼らのマルチマップを見たいかもしれません。

于 2013-02-25T21:11:22.807 に答える
0

HashMapsはソートできません。これらは、キーによって値を検索するために最適化されています。

于 2013-02-25T20:36:30.957 に答える
0

内部秩序を維持しないのでHashMaps、そのようにすることはできません。そこでできる最善のことは、ですべての値を取得し、map.values()それを繰り返し処理して、どれが最も長いかを確認することです。

HashMap<T, V> map = ...
Collection<V> values = map.values();

int maxLen = Integer.MIN_VALUE;
Set<String> winner = null;
for(V v : values) {
   if(v.size() > maxLen) {
     winner = v;
   }
}

TおよびVは任意のタイプです。あなたの場合、TはStringに等しく、VはSetに等しくなります。

于 2013-02-25T20:40:46.217 に答える
0

Setとの両方を保持するカスタムオブジェクトを作成しますString。クラスに実装させComparable、実装は設定されたサイズを使用します。次に、を使用しListてそれを埋めCollections.sort()、目的の結果を取得します。

class A implements Comparable {
    Set set;
    String string;

    ...constructor etc....

    @Override
    public int compare(A a,A b) {
        return Integer.compare(a.set.size(), b.set.size());
    }
}
于 2013-02-25T21:00:37.720 に答える