我正在寻找排序Map< String,Integer>的方法.按值.我发现了
this post,它解决了我的排序问题,但并不完全.根据帖子,我写了以下代码:
import java.util.*; public class Sort { static class ValueComparator implements Comparator<String> { Map<String,Integer> base; ValueComparator(Map<String,Integer> base) { this.base = base; } @Override public int compare(String a,String b) { if (base.get(a) >= base.get(b)) { return 1; } else { return -1; } } } public static void main(String[] args) { HashMap<String,Integer> map = new HashMap<String,Integer>(); ValueComparator vc = new ValueComparator(map); TreeMap<String,Integer> sorted = new TreeMap<String,Integer>(vc); map.put("A",1); map.put("B",2); sorted.putAll(map); for (String key : sorted.keySet()) { System.out.println(key + " : " + sorted.get(key)); // why null values here? } System.out.println(sorted.values()); // But we do have non-null values here! } }
输出:
A : null B : null [1,2] BUILD SUCCESSFUL (total time: 0 seconds)
从输出可以看出,get方法总是返回null.原因是我的ValueComparator.compare()方法永远不会返回0,我已经通过制作了this post.
public int compare(String a,String b) { if (base.get(a) > base.get(b)) { return 1; }else if(base.get(a) == base.get(b)){ return 0; } return -1; }
我已经测试了这段代码,并引入了一个关键的合并问题.换句话说,当这些值相等时,它们的相应键被合并.
我也试过以下:
public int compare(String a,String b) { if (a.equals(b)) return 0; if (base.get(a) >= base.get(b)) { return 1; } else return -1; }
它也不工作.一些值仍为空.此外,此解决方法可能存在逻辑问题.
解决方法
在比较功能中,当值相等时,您应该比较键.这将确保具有相同值的不同键不会被“合并”,因为它消除了否则将相等的条目.
例如:
@Override public int compare(String a,String b) { Integer x = base.get(a); Integer y = base.get(b); if (x.equals(y)) { return a.compareTo(b); } return x.compareTo(y); }