在Hashmap <string,object =“”> </string,>中对Object的值进行排序

时间:2012-04-18 16:49:00

标签: java sorting hashmap

我想按对象的值对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;
        }

我该如何正确地做到这一点?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

创建Comparator<Map.Entry<String,LoyaltyCountry>>,获取Map.entrySet(),将其放入List<Map.Entry<String,LoyaltyCountry>>并对其进行排序。

澄清:您说您希望按值排序HashMap - 这不会发生。 HashMapMap的未排序实现。此外,Map的排序实现都会对键进行排序,因此即使TreeMap也无法帮助您。

你最接近它(没有制作你自己的地图实现)会产生一个地图条目列表,这就是我在上面描述的方法。

答案 2 :(得分: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;
}