5

値でソートされた結果 HashMap を取得しようとしています。

これは HashMap のキーと値です。

map.put("ertu", 5);
map.put("burak", 4);
map.put("selin", 2);
map.put("can", 1);

私は次のような結果を得ようとします:

1 = can
2 = selin
4 = burak
5 = ertu

これが私のコードです:

import java.util.*;

public class mapTers {

    public static void main(String[] args) {

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

        map.put("ertu", 5);
        map.put("burak", 4);
        map.put("selin", 2);
        map.put("can", 1);

        Integer dizi[] = new Integer[map.size()];

        Set anahtarlar = map.keySet();

        Iterator t = anahtarlar.iterator();

        int a = 0;

        while (t.hasNext()) {
            dizi[a] = map.get(t.next());
            a++;
        }

        Arrays.sort(dizi);

        for (int i = 0; i < map.size(); i++) {
            while (t.hasNext()) {
                if (dizi[i].equals(map.get(t.next()))) {
                    System.out.println(dizi[i] + " = " + t.next());
                }
            }
        }
    }
}
4

5 に答える 5

2

次のようにエントリを並べ替えることができます (ただし、これはマップ自体を並べ替えるHashMapわけではなく、並べ替えることができないことに注意してください) -

List<Map.Entry<String, Integer>> entryList = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
        return o1.getValue().compareTo(o2.getValue());
    }
});
于 2013-06-13T23:58:33.187 に答える
1

からそれを行うことはできませんMap。少なくとも直接ではありません。

キー/エントリを取得し、すべてのマップ データをより適切な構造で取得し (ヒント: 両方の属性をカプセル化し、ソート可能な (hint2: SortedSet, List) に格納されるクラス)、ソートします。

Comparableを拡張(および実装compareTo)することを忘れないでくださいComparator

于 2013-06-13T23:58:26.850 に答える
0

この問題のデータ構造が間違っている可能性があります。また:

  1. 整数がキーで単語が値になるようにマップを反転し、マップをSortedMap、または
  2. Google Guava などのライブラリが提供する双方向マップを使用します。

逆マップ

private final SortedMap<Integer, String> TRANSLATIONS;
static {
    SortedMap<Integer, String> map = new TreeMap<>();
    map.put(1, "can");
    // ...
    TRANSLATIONS = Collections.unmodifiableSortedMap(map);
}

グアバ BiMap

private final BiMap TRANSLATIONS =
   new ImmutableBiMap.Builder<String, Integer>()
        .put("ertu", 5);
        .put("burak", 4);
        .put("selin", 2);
        .put("can", 1);
        .build();

次に、必要に応じて、キー セットまたは値セットの並べ替えられたバージョンを反復処理します。例えば、

TRANSLATIONS.inverse.get(4); // "burak"

私はただ興味があります。文字列は何語で書かれていますか?

于 2013-06-14T00:10:36.997 に答える
0

これは、 https ://stackoverflow.com/a/13913206/1256583 から取得したソリューションの 1 つです。

ソートされていないマップを渡すだけで、ソートされたマップが得られます。

private static Map<String, Integer> sortByComparator(Map<String, Integer> unsortMap, final boolean order) {

    List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(unsortMap.entrySet());

    // Sorting the list based on values
    Collections.sort(list, new Comparator<Entry<String, Integer>>() {
        public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
            if (order) {
                return o1.getValue().compareTo(o2.getValue());
            }
            else {
                return o2.getValue().compareTo(o1.getValue());

            }
        }
    });

    // Maintaining insertion order with the help of LinkedList
    Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
    for (Entry<String, Integer> entry : list) {
        sortedMap.put(entry.getKey(), entry.getValue());
    }

    return sortedMap;
}

出力するには、エントリ セットに対して単純な反復を実行します。

public static void printMap(Map<String, Integer> map) {
    for (Entry<String, Integer> entry : map.entrySet()) {
        System.out.println("Key : " + entry.getKey() + " Value : "+ entry.getValue());
    }
}
于 2013-06-14T00:02:04.973 に答える