用程序给出随便大小的10 个数,序号为1-10,按从小到大顺序输出,并输出相应的序号—map

思路: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值不相等则不会发生覆盖

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值