我有一个树形图,其中我按升序排序元素,如0,1,2,3等。这些元素按其值排序,即0,1,2等是值。我使用了比较器排序他们。我想保留这个顺序,除了我想在地图的末尾放置0值的元素。怎么做?
答案 0 :(得分:5)
正如您已经说过的,您的TreeMap已经排序,因此允许您在“end”附加元素是完全没有意义的,即使TreeMaps不能以这种方式工作。
你可以做的是以一种决定“0”是最大元素的方式配置你的比较器,所以他将所有“0”排序到最后。 请注意,根据排序算法,结尾处的“0”顺序是随机的。
答案 1 :(得分:1)
您可以修改比较器并将0视为最大数字
答案 2 :(得分:1)
刚才意识到,您要对地图值进行排序,而不是键。比较器没有获得使其更复杂的值。 new 方法使用第二个(未排序的)映射,它只收集所有值,比较器可以使用它来查找键的值:
private static Map<String, Integer> helper = new HashMap<String, Integer>();
private static Comparator<String> myComparator
= new Comparator<String>() {
public int compare(String s1, String s2) {
Integer i1 = helper.get(s1);
Integer i2 = helper.get(s2);
if (i1 == 0) return 1; // i1 > i2
if (i2 == 0) return -1; // i1 < i2
return i1.compareTo(i2);
}
};
public static void main (String[] args) throws java.lang.Exception {
helper.put("minus one", -1);
helper.put("zero", 0);
helper.put("one", 1);
helper.put("very much", Integer.MAX_VALUE);
helper.put("nothing", 0);
helper.put("null", 0);
Map<String, Integer> map = new TreeMap<String, Integer>(myComparator);
map.putAll(helper);
for(Map.Entry<String, Integer> entry:map.entrySet()) {
System.out.printf("%s = %s%n", entry.getKey(), entry.getValue());
}
}
输出结果为:
minus one = -1
one = 1
very much = 2147483647
nothing = 0
zero = 0
null = 0