思路:Map中要求键值唯一,随机生成的数可能重复,不能作为键值,但序号唯一,所以可能作为键值
第一种方法:使用map.entrySet()获取Entry构成的Set,使用TreeSet进行自定义比较器的方式对值排序
Map<Integer, Integer> map=new HashMap<Integer, Integer>();
Random r=new Random();
for (int i = 1; i <=10; i++)
map.put(i, r.nextInt(100));
Set<Entry<Integer, Integer>> eset=map.entrySet();
TreeSet<Entry<Integer, Integer>> ts=new TreeSet<Map.Entry<Integer,Integer>>(
new Comparator<Entry<Integer,Integer>>() {
@Override
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
ts.addAll(eset);
System.out.println(ts);
第二种方法:使用map.entrySet()获取Entry构成的Set,使用List将Set变得可比较,调用Collections.sort()对值排序
Map<Integer, Integer> map=new HashMap<Integer, Integer>();
Random r=new Random();
for (int i = 1; i <=10; i++)
map.put(i, r.nextInt(100));
Set<Entry<Integer, Integer>> eset=map.entrySet();
List<Entry<Integer, Integer>> list=new ArrayList<Map.Entry<Integer,Integer>>(eset);
Collections.sort(list, (obj1,obj2)->
obj1.getValue().compareTo(obj2.getValue())
);
System.out.println(list);
第三种方法:使用LinkedHashMap记录插入的顺序,由于TreeMap只能对键排序,构建TreeMap存放已拍好序的map,自定义比较器获取键所对应的值进行排序,当键为空时,当值为空时如何处理,且有多个值为空时处理逻辑
Map<Integer, Integer> map=new LinkedHashMap<Integer, Integer>();
map.put(null,123);
map.put(999, null);
map.put(222, null);
Random r=new Random();
for (int i = 1; i <=10 ; i++)
map.put(i, r.nextInt(100));
System.out.println(map);
Map<Integer, Integer> map2=new TreeMap<Integer, Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
Integer val1=map.get(o1);
Integer val2=map.get(o2);
if (val1==null || val2==null) {
return val1==val2?0:-1;
}
return map.get(o1).compareTo(map.get(o2));
}
});
map2.putAll(map);
System.out.println(map2);
问题:可能会因为value相等导致不同key的丢失
解决方法:可以在value相等时继续比较key值;如果key值相等而value值不相等则不会发生覆盖