Java Map排序——按key和按value

Map的排序分为按key排序和按value排序。这里讲讲这两种方法。

一、按key排序

借助TreeMap来按key排序。TreeMap默认按key进行升序排序。如果想改变默认的顺序,定义一个Comparator即可。
代码:
public static void main(String[] args) {
		Map<Integer, String> map = new TreeMap<Integer, String>(
				new Comparator<Integer>() {
					@Override
					public int compare(Integer str1, Integer str2) {
						return str2.compareTo(str1);
					}
				});
		map.put(101, "yu");
		map.put(21, "th");
		map.put(221, "kt");
		map.put(1622, "gj");

		for (Map.Entry<Integer, String> entry : map.entrySet()) {
			System.out.println(entry.getKey() + " " + entry.getValue());
		}

	}
输出结果:
1622 gj
221 kt
101 yu
21 th
可见结果按key降序排序了。


二、按value排序

    TreeMap主要是针对key进行默认排序的,并没有针对value的排序。但是有时候我们需要对value进行排序,所以采取的策略是将map变为List,然后利用Collections.sort进行排序,同时重写Comparator方法。 

例子:
/**
	 * 按照value对Map排序
	 * @param map
	 * @param isAsc 是否升序排序
	 * @return ArrayList 有序存储着Map的元素
	 */
	public static ArrayList<Map.Entry<String, Integer>>  sortMapByValue2(Map<String, Integer> map,
			final boolean isAsc) {
		//把Map转换为List
		List<Map.Entry<String, Integer>> entries = new ArrayList<Map.Entry<String, Integer>>(
				map.entrySet());
		//利用Collections.sort进行排序
		Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
			public int compare(Map.Entry<String, Integer> obj1,
					Map.Entry<String, Integer> obj2) {
				if(isAsc)
					return obj1.getValue().compareTo(obj2.getValue());
				else
					return obj2.getValue().compareTo(obj1.getValue());
			}
		});
		return (ArrayList<Entry<String, Integer>>) entries;
	}

 
测试代码:
	public static void main(String[] args) {
		Map<String,Integer> map = new HashMap<String,Integer>();
		map.put("图书", 4);
		map.put("音像", 6);
		map.put("素材", 9);
		map.put("音乐", 8);
		map.put("影视", 7);
		map.put("动漫", 4);
		map.put("歌曲", 3);
		map.put("图片", 2);
		map.put("图标", 6);
		
		ArrayList<Map.Entry<String, Integer>> entries = sortMapByValue0(map,true);
		
		for (Map.Entry<String, Integer> entry:entries) {
			System.out.println(entry.getKey() + ":"	+ entry.getValue());
		}	 
	}

运行结果:
图片:2
歌曲:3
图书:4
动漫:4
图标:6
音像:6
影视:7
音乐:8
素材:9
上面代码是针对元素是<String,Integer>的Map,不适用于<String,String>或<String,Long>等情况。怎么办?再写几个针对不同类型的方法?那样太费劲了,并且代码冗余,不利于维护。有其他好的解决方法吗?有的,泛型。
泛型让编程人员能够使用类型抽象,也就是说编程的时候不用管数据具体的类型是什么。
代码:
	/**
	 * 按照value对Map排序
	 * @param map
	 * @param isAsc 是否升序排序
	 * @return ArrayList 有序存储着Map的元素
	 */
	public static<K, V extends Comparable<V>> ArrayList<Map.Entry<K, V>> 
	sortMapByValue(Map<K, V> map,final boolean isAsc) {
		//把Map转换为List
		List<Map.Entry<K, V>> entries = new ArrayList<Map.Entry<K, V>>(
				map.entrySet());
		//利用Collections.sort进行排序
		Collections.sort(entries, new Comparator<Map.Entry<K, V>>() {
			public int compare(Map.Entry<K, V> obj1,
					Map.Entry<K, V> obj2) {
				if(isAsc)
					return obj1.getValue().compareTo(obj2.getValue());
				else
					return obj2.getValue().compareTo(obj1.getValue());
			}
		});
		return (ArrayList<Entry<K, V>>) entries;
	}
测试代码:
	public static void main(String[] args) {
		//测试代码1
		System.out.println("测试代码1:");
		Map<String,Integer> map = new HashMap<String,Integer>();
		map.put("图书", 4);
		map.put("音像", 6);
		map.put("素材", 9);
		map.put("音乐", 8);
		map.put("影视", 7);
		map.put("动漫", 4);
		map.put("歌曲", 3);
		map.put("图片", 2);
		map.put("图标", 6);
		
		ArrayList<Map.Entry<String, Integer>> entries = sortMapByValue(map,true);
		for (Map.Entry<String, Integer> entry:entries) {
			System.out.println(entry.getKey() + ":"	+ entry.getValue());
		}
		
		//测试代码2
		System.out.println("\n测试代码2:");
		Map<String, String> map2 = new HashMap<String, String>();
		map2.put("图书", "s");
		map2.put("音像", "f");
		map2.put("素材", "c");
		map2.put("音乐", "e");
		map2.put("影视", "d");

		ArrayList<Map.Entry<String, String>> entries2 = sortMapByValue(map2, true);
		for (Map.Entry<String, String> entry : entries2) {
			System.out.println(entry.getKey() + ":" + entry.getValue());
		}
	}
运行结果:
测试代码1:
图片:2
歌曲:3
图书:4
动漫:4
图标:6
音像:6
影视:7
音乐:8
素材:9

测试代码2:
素材:c
影视:d
音乐:e
音像:f
图书:s











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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值