我已按字母顺序阅读有关排序列表的内容,例如:Hashmap sorting,Sorting Maps
我有一个Map<String, Integer>
,其值为
Tarantulas, 6
Lions, 5
Snakes, 2
Zoopies, 2
Zappin, 2
Chapas, 1
Zong Zwing, 1
Chingos, 1
Chapis, 1
Grouches, 0
我需要(仅)按字母顺序对具有相同点的部分进行排序。这是样本数据,因此不会知道Map中的实际值,因此需要根据存在的任何值进行排序。我已使用以下方法对值进行分组/排序:
public <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
Comparator<K> valueComparator = new Comparator<K>() {
public int compare(K k1, K k2) {
int compare = map.get(k2).compareTo(map.get(k1));
if (compare == 0) {
return 1;
} else {
return compare;
}
}
};
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}
这是预期的结果:
Tarantulas, 6
Lions, 5
Snakes, 2
Zappin, 2
Zoopies, 2
Chapas, 1
Chapis, 1
Chingos, 1
Zong Zwing, 1
Grouches, 0
所以问题是:我如何只对地图中具有相同点(整数值)的那些部分进行排序,并将其余部分保留原样?
我正在使用Java 7。
答案 0 :(得分:2)
以下是如何使用比较器的示例。排序后,您可以将集合中的所有条目放入LinkedHashMap中,以保留元素的顺序。
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("Tarantulas", 6);
map.put("Lions", 5);
map.put("Snakes", 2);
map.put("Zoopies", 2);
map.put("Zappin", 2);
map.put("Chapas", 1);
map.put("Zong Zwing", 1);
map.put("Chingos", 1);
map.put("Chapis", 1);
map.put("Grouches", 0);
SortedSet<Map.Entry<String, Integer>> sortedSet = new TreeSet<>(new Comparator<Map.Entry<String,Integer>>() {
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
int result = o1.getValue().compareTo(o2.getValue());
result*=-1;
if(result==0)
result = o1.getKey().compareTo(o2.getKey());
return result;
}
});
sortedSet.addAll(map.entrySet());
for(Entry<String, Integer> entry:sortedSet)
System.out.println(entry.getKey()+"="+entry.getValue());
}
答案 1 :(得分:1)
尝试:
public <K extends Comparable<K>, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
Comparator<K> valueComparator = new Comparator<K>() {
public int compare(K k1, K k2) {
int compare = map.get(k2).compareTo(map.get(k1));
if (compare == 0) {
return k1.compareTo(k2); // <- To sort alphabetically
} else {
return compare;
}
}
};
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}