Comparator实现排序后,返回0值数据丢失问题

现象:map通过自定义比较 器比较后获取排序后的map发生数据丢失的现象

代码:

public void testValueComparatorLongOrder(){
		Map<String, String> mapData =new HashMap<>();
		mapData.put("1", "2017-12-22 17:29");
		mapData.put("2", "2017-12-22 19:29");
		mapData.put("3", "2017-12-22 17:29");
		mapData.put("4", "2017-12-22 16:45");
		mapData.put("5", "2017-12-22 16:45");

		ValueComparatorLongDesc bvc =  new ValueComparatorLongDesc(mapData);  
	    TreeMap<String,String> descMap = new TreeMap<>(bvc); 
	    descMap.putAll(mapData);
	    System.out.println("mapData:"+mapData);
	    System.out.println("descMap:"+descMap);
	}
	/**
	 *  降序排序方法
	 */
	class ValueComparatorLongDesc implements Comparator<String> {  
	    Map<String, String> base;  
	    public ValueComparatorLongDesc(Map<String, String> base) {  
	        this.base = base;  
	    }  
	    @Override
	    public int compare(String a, String b) {
	    	String value1=base.get(a);
	    	long longA=0L;
	    	String value2=base.get(b);
	    	long longB=0L;
	    	longA=TimeUtil.formTimeToLong(value1, YMD_HM_FORM);
	    	longB=TimeUtil.formTimeToLong(value2, YMD_HM_FORM);
	    	int result= new Long(longB).compareTo(new Long(longA));
	    	System.out.println("result is:"+result);
	    	return result;
	    	/*if (longA >= longB) {  
	            return 1;  
	        } else {  
	            return -1;  
	        } */
	    }  
	}
输出结果:

result is:0
result is:-1
result is:0
result is:1
result is:1
result is:0
mapData:{3=2017-12-22 17:29, 2=2017-12-22 19:29, 1=2017-12-22 17:29, 5=2017-12-22 16:45, 4=2017-12-22 16:45}
descMap:{2=2017-12-22 19:29, 3=2017-12-22 17:29, 5=2017-12-22 16:45}

发现所有值相同的数据只保留了一个,出现了数据丢失现象,经过测试发现,修改比较器的返回结果:

正确方法

	/**
	 *  降序排序方法
	 */
	class ValueComparatorLongDesc implements Comparator<String> {  
	    Map<String, String> base;  
	    public ValueComparatorLongDesc(Map<String, String> base) {  
	        this.base = base;  
	    }  
	    @Override
	    public int compare(String a, String b) {
	    	String value1=base.get(a);
	    	long longA=0L;
	    	String value2=base.get(b);
	    	long longB=0L;
	    	longA=TimeUtil.formTimeToLong(value1, YMD_HM_FORM);
	    	longB=TimeUtil.formTimeToLong(value2, YMD_HM_FORM);
	    	int result= new Long(longB).compareTo(new Long(longA));
	    	System.out.println("result is:"+result);
	    	//return result;
	    	if (longA >= longB) {  
	            return 1;  
	        } else {  
	            return -1;  
	        } 
	    }  
	}
输出结果:
result is:0
result is:-1
result is:0
result is:1
result is:1
result is:1
result is:1
result is:1
result is:0
mapData:{3=2017-12-22 17:29, 2=2017-12-22 19:29, 1=2017-12-22 17:29, 5=2017-12-22 16:45, 4=2017-12-22 16:45}
descMap:{5=2017-12-22 16:45, 4=2017-12-22 16:45, 3=2017-12-22 17:29, 1=2017-12-22 17:29, 2=2017-12-22 19:29}

发现修改后数据不再丢失,经分析发现map比较时比较器的返回结果只能是1或者-1,返回0会造成数据的丢失

返回1表示正序排列,-1表示倒叙排列,

1:longB>longA

-1:longB<longA

0一般表示数据相等在如下方法中:

new Long(longB).compareTo(new Long(longA))

但是比较器中返回0确造成了数据丢失,原因还不明确,解决方法为去掉0值,并且不影响正确的排序

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三知之灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值