【发布时间】:2014-07-11 08:57:32
【问题描述】:
我有一个需要按值排序的 TreeMap。如果值是整数类型,我可以对地图进行排序。
public class MapSorting {
public static Map<String, Integer> sortByValues(Map<String, Integer> tempMap) {
ValueComparator bvc = new ValueComparator(tempMap);
Map<String, Integer> sortedMap = new TreeMap<String, Integer>(bvc);
sortedMap.putAll(tempMap);
return sortedMap;
}
}
class ValueComparator implements Comparator<String> {
Map<String, Integer> base;
public ValueComparator(Map<String, Integer> base) {
this.base = base;
}
public int compare(String a, String b) {
if (base.get(a) >= base.get(b)) {
return -1;
} else {
return 1;
}
}
}
但是我如何使方法通用?我希望能够将带有任何类型的键和值的 Map 发送到此方法。
我想返回一个基于值排序的 TreeMap。
有人可以帮忙吗?
【问题讨论】:
-
您可以使用
instanceOf或getClass()来获取对象的类型并在您的compare(Object, Object)方法中进行不同的比较。但是您为什么要这样做呢? Generics 的引入是为了防止此类使用引起的错误。如果您正在考虑打破泛型,我相信您的设计存在缺陷。 -
您必须将
compare设为通用。但是为什么要使 key 和 value 通用?用例是什么? -
TreeMap 旨在按键排序,但您希望按值对其进行排序。我认为 TreeMap 不适合您的需要。例如,您可以将
TreeMap<String, Integer>转换为List<Entry<Integer, String>>,这样排序会容易得多。 -
@TheLostMind 我想让方法 sortByValues 通用,以便可以为任何类型的地图对象调用它,即 Map
或 Map 或 Map. -
@ArnaudDenoyelle 如果地图值是整数,则代码工作正常。如果 Map Values 也是 String 类型,我需要帮助才能使该方法正常工作。因此,我需要一种适用于所有类型的键和值的通用方法。
标签: java generics comparator comparable