Java-TreeMap对Key/Value自定排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SZU_Crayon/article/details/83998960

Java-TreeMap对Key/Value自定排序

Key自定义排序:

实现Comparator接口:

1)重写接口Comparator中的compare方法

//实现接口:Comparator
class MyComparator implements Comparator{
	
	//自定义排序,对价格升序排序
    //实例key为double类型
	public int compare(Object o1,Object o2) {
		double a=(double)o1;
		double b=(double)o2;
		if(a-b>1e-6) {
			return 1;
		}else if(b-a>1e-6) {
			return -1;
		}else {
			return 0;
		}
	}
}

2)创建方法:将原map值搬入定义有排序规则的另一map

    //创建map,key为价格,value为尺寸
	Map<Double,Double> SortByPrice=new TreeMap<>();

    //调用重排方法
	SortByPrice=cmp(SortByPrice);

    //map重排方法
	public static Map<Double,Double> cmp(Map<Double,Double> map){
		
		//创建新的map,使用自定义的key排序规则
		Map<Double,Double> Res=new TreeMap<>(new MyComparator());
		Res.putAll(map);	//装入原先map的数据
		
		return Res;	//返回自定义key排序的map对象
	}

 

实现Comparable接口:

1)将Comparable的子类作为TreeMap的key值,并重写Comparable中的compareTo方法

Tip:以此为key的map将按重写的compareTo规则进行排序

//MyKey.java
//实现Comparable接口
class MyKey implements Comparable{
	
	public double Pirce;
	public MyKey(double Price) {
		this.Pirce=Price;
	}
	
	//对Price进行升序排序
	public int compareTo(Object o) {
		MyKey key=(MyKey)o;
		if(key.Pirce-this.Pirce>1e-6) {
			return -1;
		}else if(this.Pirce-key.Pirce>1e-6) {
			return 1;
		}else {
			return 0;
		}
	}
}

总结:

留个坑给自己,第二种方法会不会导致TreeMap中的containsKey方法不能正常使用,是否得重写equals和compare,过后会有个更新。

 

Value自定义排序:

实现Comparator接口

1)重写Comparator中的compare方法

    /*自定排序:对单词出现次数(Value)降序
	 * 重写compare实现
	 */
	private class SortByValue implements Comparator<Map.Entry<String, Integer>>{
		
		@Override
		public int compare(Entry<String, Integer> l, Entry<String, Integer> r) {
			// TODO Auto-generated method stub
			return r.getValue()-l.getValue();
		}

	}

2)将TreeMap转为数据类型为Map.Entry的ArraysList,调用Collections的sort方法

private TreeMap<String,Integer> Words_Analysis;
private List<Map.Entry<String,Integer>> Result;

/*将map统计的结果以Entry-List形式存储
 * 调用集合类中的Sort方法*/
public void Sort() {
		
	Result.addAll(Words_Analysis.entrySet());
	SortByValue cmp=new SortByValue();
	Collections.sort(Result, cmp);
}

上述引用实例的源码(GitHub):

对Key自定义排序:

1)实现Comparator接口:对某商品价格的排序

2)实现Comparable接口:对某商品价格的排序

对Value自定义排序:

1)实现Comparator接口:统计本地txt文件中单词个数

 

猜你喜欢

转载自blog.csdn.net/SZU_Crayon/article/details/83998960