2017-10-02 10 views
0

文字を整数にマップするHashMapがあります。値でソートするために、私はコンパレータを書き、私はTreeMapを使っています。しかし、私は価値を欠いている。私はString "tree"をチェックしました。各ループの後のマップ 'chars'は{r = 1、t = 1、e = 2}のようになり、putAll(2行後)の後のツリーは{e = 2、r = 1}になります。 char 't'に何が起こっていますか?なぜそれが欠けているのですか?そして私はそれをどのように変更できますか?putAll()後のTreeMapの値がありません

class ValueComparator implements Comparator<Character> { 

private Map<Character, Integer> map; 

public ValueComparator(Map<Character, Integer> map) { 
    this.map = map; 
} 

public int compare(Character a, Character b) { 
    return map.get(b).compareTo(map.get(a)); 
} 
} 

public String frequencySort(String s) { 
    if (s.length() <= 1) return s; 

    HashMap<Character,Integer> chars = new HashMap<Character,Integer>(); 
    for(Character c : s.toCharArray()){ 
     if (chars.containsKey(c)){ 
      chars.put(c,chars.get(c)+1); 

     } 
     else { 
      chars.put(c,1); 
     } 
    } 

    TreeMap<Character,Integer> tree = new TreeMap<Character,Integer>(new ValueComparator(chars)); 
    tree.putAll(chars); 

    /** 
    * rest of the code 
    **/ 

} 
+2

あなたのコンパレータを簡単な修正は、タイブレーカーとしてキーを使用することです「r」と「t」は等しいとみなします。マップには、等しいキーの2つのエントリがありません。 – user2357112

+0

私はそれを得る。しかし、私はそれについて何をすべきかわからない...あなたは私にヒントを与えることができますか? – Malvinka

+0

ソートを行うためにTreeMapを使用しないことをお勧めします。 – user2357112

答えて

2

ValueComparatorは、重複と同じ数のエントリを処理します。あなたは、ソート、周波数マップを構築するために、それをストリームを使用し、それをLinkedHashMap命じ保存することができ、また

public int compare(Character a, Character b) { 
    int result = map.get(b).compareTo(map.get(a)); 
    return result != 0 ? result : a.compareTo(b); 
} 

Map<Character, Integer> counts = s.chars() 
     .mapToObj(i -> (char)i) 
     .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(c -> 1))) 
     .entrySet() 
     .stream() 
     .sorted(Collections.reverseOrder(Entry.comparingByValue())) 
     .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, b) -> b, LinkedHashMap::new)); 
関連する問題