2017-06-28 17 views
1

どちらのHashMapsもソートする必要があるネストされたhashMapsをソートしようとしています。HashMapとそのネストされたHashMapの並べ替え

最初のhashMapはキーでソートする必要があります。 2番目は値でソートする必要があります。 これまでのところ、私は最初のhashMapのキーを整列させ、並べ替えて並べ替えることができます。

私のハッシュマップは、例は、我々は最初の文字列は、名前、車のブランド、qntyあるとしましょう。この

HashMap<String,HashMap<String,Integer>> carOwners = new 
            HashMap<String,HashMap<String, Integer>>(); 

のように見えます。

例: デビッド:

アウディ> 5

BMWの> 4

Izabel:

VWのでBasicly最初の> 10

メガバイト> 4

名前をソートし、次に入れ子になったハットをソートします値によってsh。 (>

+1

あなたは 'HashMap'を並べ替えることができない、使用することを検討してください' LinkedHashMap'ではなく –

+0

'の性質によってHashMap'彼らは秩序を持っていません。それらを並べ替えることによってあなたはどういう意味ですか? – Chris

+1

@TuyenNguyen 'LinkedHashMap'は' HashMap'です。そして技術的には 'LinkedHashMap'もソートできません。 – shmosel

答えて

3

Mapあなたは以下のクラスを使用することができ、ソートの場合:これは行うことができますどのように...カントは、任意の有用な情報を見つける。TreeMapofficial documentationが言うように、

マップはに従ってソートされ自然にそのキーの順序、または使用されるコンストラクタに応じて、マップ作成時に提供されるComparatorによって。

あなたは挿入順内の要素をソートしたい場合は、ご使​​用くださいLinkedHashMap

このリンクリストは、通常、キーがマップ(挿入オーダー)に挿入された順序である反復順序を定義します。

Mapを値でソートする場合は、postを参照してください。 Java7とJava8のためのものです。

希望します。

+0

あなたはそれを理解しましたか? –

1

最初のマップをTreeMap、2番目のマップを値で並べ替えます。これを参照してくださいpost

以下は問題のコードスニペットです。

public static void main(String[] args) { 
    Map<String, HashMap<String, Integer>> carOwners = new TreeMap<String, HashMap<String, Integer>>(); 
    HashMap<String, Integer> nameQuantity = new HashMap<String, Integer>(); 
    nameQuantity.put("Audi", 5); 
    nameQuantity.put("BMW", 4); 
    carOwners.put("David", sortByValue(nameQuantity)); 
    nameQuantity = new HashMap<String, Integer>(); 
    nameQuantity.put("VW", 10); 
    nameQuantity.put("MB", 4); 
    carOwners.put("Izabel", sortByValue(nameQuantity)); 
    for (Map.Entry<String, HashMap<String, Integer>> carOwnerEntry : carOwners.entrySet()) { 
     System.out.println(carOwnerEntry.getKey()); 
     HashMap<String, Integer> nameQty = carOwnerEntry.getValue(); 
     for (Map.Entry<String, Integer> nameQtyEntry : nameQty.entrySet()) { 
      System.out.println(nameQtyEntry.getKey() + " " + nameQtyEntry.getValue()); 
     } 
    } 

public static <K, V extends Comparable<? super V>> HashMap<K, V> sortByValue(Map<K, V> map) { 
    List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(map.entrySet()); 
    Collections.sort(list, new Comparator<Map.Entry<K, V>>() { 
     public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) { 
      return (o1.getValue()).compareTo(o2.getValue()); 
     }); 
    HashMap<K, V> result = new LinkedHashMap<K, V>(); 
    for (Map.Entry<K, V> entry : list) { 
     result.put(entry.getKey(), entry.getValue()); 
    } 
    return result; 
} 
関連する問題