2012-08-29 7 views
33

LinkedHashMapにStringとIntegerが含まれていることを前提に、LinkedHashMapの値に基づいてソートする方法を教えてください。ですから、IntegersであるValuesに基づいてソートする必要があります。 ありがとうございますLinkedHashMapをソートする

+2

あなたがのLinkedHashMapを使用する必要がありますか? TreeMapは役に立ちますか? – RNJ

+2

これは役立つかもしれないhttp://stackoverflow.com/questions/780541/how-to-sort-hash-map – RNJ

+0

ああ。そうですか。コメントを読むことを気にしなかった。^_^ – DankMemes

答えて

26

これは、今のJava 8のストリームとかなり簡単です:あなたは、ソートする中間マップは必要ありません。

map.entrySet().stream() 
    .sorted(Map.Entry.comparingByValue()) 
    .forEach(entry -> ...); 
4

LinkedHashMapはただ挿入注文を維持しています。値に基づいてソートする場合は、独自のcomparatorを作成する必要があります。

+1

華麗な、はい、ありがとう、私は自分のコンパレータを書いた – Ramin

+1

私はあなた自身のコンパレータを書く必要はないと思う。 'Map.Entry.comparingByValue()'が生成するはずです。また、 'Collections.reverseOrder(Map.Entry.comparingByValue())'によって逆にすることもできます。 – sprinter

+0

@sprinter:値がカスタムオブジェクトのタイプの場合はどうなりますか? – kosa

66
List<Map.Entry<String, Integer>> entries = 
    new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() { 
    public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b){ 
    return a.getValue().compareTo(b.getValue()); 
    } 
}); 
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>(); 
for (Map.Entry<String, Integer> entry : entries) { 
    sortedMap.put(entry.getKey(), entry.getValue()); 
} 
+4

まあまあ、私はまったく同じコードを書いていました! :)最後の部分を除いて、私はOPが実際にそれらを地図に戻す必要があるとは思わない。 –

+0

ありがとうございました。非常に便利なコード – Ramin

+0

ニースの答え。降順で並べ替える必要があったので、コンパレータから値を返す間に-ve記号を追加しました。 –

1
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.NavigableMap; 
import java.util.SortedMap; 
import java.util.TreeMap; 

public class HashMapTest { 

public static void main(String[] args) { 

    Map<String, Integer> map=new LinkedHashMap<String, Integer>(); 

    map.put("a", 11); 
    map.put("B", 12); 
    map.put("c", 3); 
    map.put("d", 4); 
    map.put("e", 5); 
    map.put("f", 6); 
    map.put("g", 7); 
    map.put("h", 8); 
    map.put("i", 9); 
    map.put("j", 3); 
    map.put("k", 2); 
    map.put("l", 1); 

    List<Map.Entry<String, Integer>> entries = new 
    ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 
      Collections.sort(entries,new CustomizedHashMap()); 


      Map<String, Integer> sortedMap = new LinkedHashMap<String, 
    Integer>(); 
      for (Map.Entry<String, Integer> entry : entries) { 
       sortedMap.put(entry.getKey(), entry.getValue()); 
       System.out.print(sortedMap.put(entry.getKey(), 
      entry.getValue())+" "); 
      } 
    } 
    } 

class CustomizedHashMap implements Comparator<Map.Entry<String, Integer>> { 

    @Override 
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 
    // TODO Auto-generated method stub 
    return -o1.getValue().compareTo(o2.getValue()); 
    } 

} 
関連する問題