2

オブジェクトの値で Hashmap をソートしたい。この場合、国コードで。

  KEY              OBJECT                        
  String        LoyaltyCountry
                     - country name
                     - country code
                     - country loc

私のコードは次のとおりです。

public static HashMap<String, LoyaltyCountry> loyaltyCountrySortMap(HashMap<String, LoyaltyCountry> loyaltyCountryMap) {

            if (loyaltyCountryMap != null) {
                List keys = new ArrayList();
                keys.addAll(loyaltyCountryMap.keySet());
                Collections.sort(keys, new Comparator<LoyaltyCountry>() {
                    public int compare(LoyaltyCountry o1, LoyaltyCountry o2) {
                        return o1.getCountryName().compareTo(o2.getCountryName());
                    }
                });
            }

            return loyaltyCountryMap;
        }

どうすればこれを正しく行うことができますか?

4

3 に答える 3

7

以下は、値でソートされた Map.Entry アイテムを含む Set を返すメソッドです。

public static <K, V extends Comparable<? super V>> SortedSet<Map.Entry<K, V>> entriesSortedByValues(Map<K, V> map) {
    SortedSet<Map.Entry<K, V>> sortedEntries = new TreeSet<Map.Entry<K, V>>(
            new Comparator<Map.Entry<K, V>>() {
                @Override
                public int compare(Map.Entry<K, V> e1, Map.Entry<K, V> e2) {
                    return e1.getValue().compareTo(e2.getValue());
                }
            });
    sortedEntries.addAll(map.entrySet());
    return sortedEntries;
}
于 2012-04-18T16:58:23.267 に答える
1

を作成しComparator<Map.Entry<String,LoyaltyCountry>>、 を取得しMap.entrySet()、 に入れList<Map.Entry<String,LoyaltyCountry>>、並べ替えます。

明確化: 値でソートしたいと言っていますが、HashMapそれは起こりません。AHashMapは、 a のソートされていない実装ですMapMapさらに、あらゆる種類のキーの並べ替えられた実装であるため、a でもTreeMap役に立ちません。

あなたがそれに近づくことができる (独自のマップ実装を作成することを除いて) 最も近いのは、マップ エントリのリストを作成することです。これは、上で説明した方法です。

于 2012-04-18T16:53:04.523 に答える
1

ソートできませんHashMap

国名でソートされたマップの値の順序付きリストを返したいようです。

そのためには、メソッドの戻り値の型を List に変更します。

public static List<LoyaltyCountry> loyaltyCountrySortMap(
    HashMap<String, LoyaltyCountry> loyaltyCountryMap
  ) 
{

    if (loyaltyCountryMap != null) {
        List<LoyaltyCountry> values = new ArrayList();
        values.addAll(loyaltyCountryMap.values());
        Collections.sort(values, new Comparator<LoyaltyCountry>() {
            public int compare(LoyaltyCountry o1, LoyaltyCountry o2) {
                return o1.getCountryName().compareTo(o2.getCountryName());
            }
        });

        return values;
    }

    return null;
}
于 2012-04-18T16:58:58.163 に答える