Java中 HashMap没有排序, 如果想要对HashMap排序怎么办,当然是用TreeMap可以,本文总结的是给已有HashMap排序
第一次试验: 排序后HashMap结果没变,
总结原因: HashMap本生是无序的,将HashMap转换为list,对list排序, 但排序以后还是使用HashMap,结果肯定错误。 因为本身HashMap排序并没有变化,
解决方法:排序以后直接使用list来获取数据
public Map<String, TopnKeyWorld> getTopnPicTrain(Map<String, TopnKeyWorld> trainRepectScore) {
Map<String, TopnKeyWorld> trainTopnMap = new LinkedHashMap<>();
TonKeyWorldCompare tonKeyWorldCompare = new TonKeyWorldCompare();
List<Map.Entry<String,TopnKeyWorld>> list = new ArrayList<>(trainRepectScore.entrySet());
Collections.sort(list,tonKeyWorldCompare);
Iterator it = trainRepectScore.keySet().iterator();
int i = 0;
//截取TOPN数据
while (it.hasNext()) {
i++;
if(i <= TOPN_TRAIN){
String keyword = (String) it.next();
trainTopnMap.put(keyword, trainRepectScore.get(keyword));
}else{
break;
}
}
return trainTopnMap;
}
public class TonKeyWorldCompare implements Comparator<Map.Entry<String, TopnKeyWorld>> {
@Override
public int compare(Map.Entry<String, TopnKeyWorld> o1, Map.Entry<String, TopnKeyWorld> o2) {
double result = o1.getValue().getIndicatorScore() - o2.getValue().getIndicatorScore();
if (result > 0)
return -1;
else if (result == 0)
return 0;
else
return 1;
}
}
第二次尝试: 结果正确(使用排序后的list获取数据)
public Map<String, TopnKeyWorld> getTopnPicTrain(Map<String, TopnKeyWorld> trainRepectScore) {
Map<String, TopnKeyWorld> trainTopnMap = new LinkedHashMap<>();
TonKeyWorldCompare tonKeyWorldCompare = new TonKeyWorldCompare();
List<Map.Entry<String, TopnKeyWorld>> list = new ArrayList<>(trainRepectScore.entrySet());
Collections.sort(list, tonKeyWorldCompare);
//截取TOPN数据
int i = 0;
for (Map.Entry<String, TopnKeyWorld> listItem : list) {
if(i < TOPN_TRAIN){
i++;
String keyword = listItem.getKey();
trainTopnMap.put(keyword, listItem.getValue());
}else{
break;
}
}
return trainTopnMap;
}