今天想用Treemap排序

先排序双列集合里的排序值。

在使用Comparator接口时 产生了问题


import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class main {
	public static void main(String[] args) {
		Map<Integer,Integer>map=new TreeMap<>(new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO Auto-generated method stub
				int i=o2-o1;
				i =  i==0? map.get(o1).compareTo(map.get(o2)):i;
				return i;
			}
		});
		
		map.put(1, 3);
		map.put(1, 2);
		map.put(3, 1);
		map.forEach((k,v)->System.out.println(k+" "+v));

	}
}

这边eclipse给我反馈的是 alt

未初始化双列集合

然后我想了好久才知道

传递比较器集合的时候 属于是初始化集合

而不是对已经存入数据的集合进行操作

即map集合还没有被完全初始化

那么就无法从map集合中获得对象 this关键字也不可以

所以应该这样 改


import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        Map<Integer, Integer> map = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                int result = o1 - o2;
                if (result == 0) {
                    return o1.compareTo(o2);
                }
                return result;
            }
        });

        map.put(1, 3);
        map.put(2, 2);
        map.put(3, 1);
        map.forEach((k, v) -> System.out.println(k + " " + v));
    }
}

但是好像Treemap的键只能映射一个值

传入已有的键后会覆盖映射值

所以这个问题应该本身就不对

alt