4
private Map<Character, Integer> frequencies;

私はキーであり、それに関連するバリューであるMapと持っています。CharacterInteger

値で並べ替えるのに最適/最速/効果的な方法は何ですか?

つまり、マップには
a、1
c、10
p、5
s、7
があり、ソート後は
a、1
p、5
s、7
c、10になります。

Priority Queueと整数でそれを行うことを考えていましたが、整数値が重複していると文字値が失われます

4

2 に答える 2

2

優先キューは適切なアプローチです。必要なのは、マップからセットを取得EntryComparatorし、キューへの入力としてaをオーバーライドすることだけです。

Map<Character,Integer> map = new HashMap<Character, Integer>();
map.put('a',1);
map.put('c',10);
map.put('p',5);
map.put('2',7);
PriorityQueue<Entry<Character, Integer>> pq = new PriorityQueue<Map.Entry<Character,Integer>>(map.size(), new Comparator<Entry<Character, Integer>>() {

    @Override
    public int compare(Entry<Character, Integer> arg0,
            Entry<Character, Integer> arg1) {
        return arg0.getValue().compareTo(arg1.getValue());
    }
});
pq.addAll(map.entrySet());
while (!pq.isEmpty()) {
    System.out.println(pq.poll());
}

降伏します(予想どおり):

a=1
p=5
2=7
c=10

注:マップの値としてキー付きのaSetまたはaを使用することは避けてください。重複する値を適切に処理できないためです。Map

于 2012-12-02T23:04:11.927 に答える
1

GoogleGuavaを使用します。これには、反転できるBiMap実装が含まれており、反転したマップキーで並べ替えるだけです。

Map<Character, Integer> myMap = HashBiMap.create();
// put your values in myMap
Map<Integer, Character> inversed = myMap.inverse();
SortedMap<Integer, Character> sortedInversed = new TreeMap<Integer, Character>(inversed);

したがって、sortedInversedを繰り返すだけです

于 2012-12-02T23:03:40.977 に答える