我想按对象的值对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;
}
我该如何正确地做到这一点?
答案 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
- 这不会发生。 HashMap
是Map
的未排序实现。此外,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;
}