现象: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值,并且不影响正确的排序