Javaでマップの値をキーで並べ替えるにはどうすればいいですか? 質問する

Javaでマップの値をキーで並べ替えるにはどうすればいいですか? 質問する

キーと値の両方に文字列を持つマップがあります。

データは次のようになります。

「質問1」、「1」、
「質問9」、「1」、
「質問2」、「4」、
「質問5」、「2」

マップをキーに基づいてソートしたいので、最終的にはquestion1, question2, question3、 などになります。

最終的に、このマップから 2 つの文字列を取得しようとしています。

  • 最初の文字列: 質問 (1 から 10 の順)
  • 2番目の文字列: 回答 (質問と同じ順序)

現在、次のものがあります:

Iterator it = paramMap.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry) it.next();
    questionAnswers += pairs.getKey() + ",";
}

これにより、質問が文字列として取得されますが、順序は正しくありません。

ベストアンサー1

短い答え

使うTreeMapまさにこれがその目的です。

このマップが渡され、タイプを判別できない場合は、次の操作を実行できます。

SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) { 
   String value = map.get(key);
   // do something
}

これにより、キーの自然な順序でマップ全体が反復処理されます。


より長い回答

技術的には、 を実装するものであれば何でも使用できますSortedMapが、まれなケースを除いて、これは に相当します。これは、の実装を使用すると通常は に相当するのTreeMapと同じです。MapHashMap

キーが Comparable を実装しない複雑な型である場合、または自然な順序を使用したくない場合はTreeMapTreeSetを渡すことができる追加のコンストラクターが必要ですComparator

// placed inline for the demonstration, but doesn't have to be a lambda expression
Comparator<Foo> comparator = (Foo o1, Foo o2) -> {
        ...
    }

SortedSet<Foo> keys = new TreeSet<>(comparator);
keys.addAll(map.keySet());

TreeMapまたはを使用する場合は、またはTreeSetとは異なるパフォーマンス特性を持つことに留意してください。大まかに言えば、要素を検索または挿入する操作はO(1)からO(Log(N))になります。HashMapHashSet

ではHashMap、アイテムを 1,000 から 10,000 に増やしても要素の検索時間にはそれほど影響しませんが、 ではTreeMap検索時間は約 1.3 倍遅くなります (Log 2と仮定)。1,000 から 100,000 に増やすと、要素の検索ごとに約 1.6 倍遅くなります。

おすすめ記事