416

キーと値の両方の文字列を持つ Map があります。

データは次のようなものです。

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

キーに基づいてマップを並べ替えたい。だから、結局、私はquestion1, question2, question3....などを持っています。


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

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

現在、私は次のものを持っています:

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

これにより、一連の質問が表示されますが、順序が正しくありません。

4

17 に答える 17

677

簡潔な答え

を使用しTreeMapます。これはまさにそのためのものです。

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

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

これは、キーの自然な順序でマップ全体を反復します。


より長い答え

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

キーが Comparable を実装しない複雑な型である場合、または自然な順序を使用したくない場合、TreeMapおよびTreeSeta を渡すことができる追加のコンストラクターがある場合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

では、HashMap1000 項目から 10,000 項目に移動しても要素を検索する時間には実際には影響しませんが、TreeMapでは検索時間は約 3 倍遅くなります ( Log 2と仮定)。1000 から 100,000 に移動すると、すべての要素のルックアップで約 6 倍遅くなります。

于 2009-05-28T18:43:59.257 に答える
152

TreeMap があなたにとって良くないと仮定します(そしてジェネリックを使用できないと仮定します):

List sortedKeys=new ArrayList(yourMap.keySet());
Collections.sort(sortedKeys);
// Do what you need with sortedKeys.
于 2009-05-28T19:03:21.807 に答える
73

を使用するTreeMapと、マップを並べ替えることができます。

Map<String, String> map = new HashMap<>();        
Map<String, String> treeMap = new TreeMap<>(map);
for (String str : treeMap.keySet()) {
    System.out.println(str);
}
于 2011-11-07T11:51:32.767 に答える
47

TreeMap を使用するだけです

new TreeMap<String, String>(unsortMap);

TreeMap は「キー」の自然な順序に従ってソートされることに注意してください。

于 2015-02-18T14:37:16.483 に答える
40

TreeMapを使用してください。

于 2009-05-28T18:44:43.187 に答える
39

すでにマップがあり、それをキーでソートしたい場合は、単に次を使用します。

Map<String, String> treeMap = new TreeMap<String, String>(yourMap);

完全な作業例:

import java.util.HashMap;
import java.util.Set;
import java.util.Map;
import java.util.TreeMap;
import java.util.Iterator;

class SortOnKey {

public static void main(String[] args) {
   HashMap<String,String> hm = new HashMap<String,String>();
   hm.put("3","three");
   hm.put("1","one");
   hm.put("4","four");
   hm.put("2","two");
   printMap(hm);
   Map<String, String> treeMap = new TreeMap<String, String>(hm);
   printMap(treeMap);
}//main

public static void printMap(Map<String,String> map) {
    Set s = map.entrySet();
    Iterator it = s.iterator();
    while ( it.hasNext() ) {
       Map.Entry entry = (Map.Entry) it.next();
       String key = (String) entry.getKey();
       String value = (String) entry.getValue();
       System.out.println(key + " => " + value);
    }//while
    System.out.println("========================");
}//printMap

}//class
于 2013-08-21T05:58:53.813 に答える
27

を使用できない場合TreeMapJava 8では、次のパラメーターを取るtoMap()メソッドを使用できます。Collectors

  • keymapper : キーを生成するマッピング関数
  • valuemapper : 値を生成するマッピング関数
  • mergeFunction : 同じキーに関連付けられた値間の衝突を解決するために使用されるマージ関数
  • mapSupplier : 結果が挿入される新しい空の Map を返す関数。

Java 8 の例

Map<String,String> sample = new HashMap<>();  // push some values to map  
Map<String, String> newMapSortedByKey = sample.entrySet().stream()
                    .sorted(Map.Entry.<String,String>comparingByKey().reversed())
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
Map<String, String> newMapSortedByValue = sample.entrySet().stream()
                        .sorted(Map.Entry.<String,String>comparingByValue().reversed())
                        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1,e2) -> e1, LinkedHashMap::new));

この例を変更して、カスタム コンパレータを使用し、次のようにキーに基づいて並べ替えることができます。

Map<String, String> newMapSortedByKey = sample.entrySet().stream()
                .sorted((e1,e2) -> e1.getKey().compareTo(e2.getKey()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1,e2) -> e1, LinkedHashMap::new));
于 2016-11-17T08:21:07.343 に答える
1
List<String> list = new ArrayList<String>();
Map<String, String> map = new HashMap<String, String>();
for (String str : map.keySet()) {
 list.add(str);
}
Collections.sort(list);
for (String str : list) {
 System.out.println(str);
}
于 2011-11-07T11:34:21.320 に答える
1

LinkedHashMapキーの順序を提供する を使用します。と同等の性能を発揮しHashMapます。どちらもインターフェースを実装Mapしているため、初期化オブジェクトHashMapを に置き換えるだけで済みますLinkedHashMap

于 2021-03-10T11:26:54.937 に答える
0

Arrays.sort メソッドを使用してキーをソートすることもできます。

Map<String, String> map = new HashMap<String, String>();
Object[] objArr = new Object[map.size()];
for (int i = 0; i < map.size(); i++) {
objArr[i] = map.get(i);
}
Arrays.sort(objArr);
for (Object str : objArr) {
System.out.println(str);
}
于 2011-11-07T11:37:36.467 に答える
0

適切な解決策がここで提供されます。HashMap不特定の順序で値を格納する があります。補助を定義TreeMapし、メソッドを使用して HashMap から TreeMap にすべてのデータをコピーしますputAll。TreeMap の結果のエントリはキー順です。

于 2020-09-08T16:30:04.630 に答える