我有以下方式的地图对象列表
List<Map<String, Object>> insurancePercentageDetails = dao.getinusrancePercentageDetails(age);
这以下列方式给出了输出。
[{Age=42, Rate12=0.40, Rate24=0.63, Rate36=0.86, Rate48=1.12, Rate60=1.39, Rate72=1.67, Rate84=1.98, Rate96=2.31, Rate108=3.30, Rate120=3.84, Rate132=4.40, Rate144=5.00, Rate156=5.62, Rate168=6.28, Rate180=6.97, Rate192=7.34, Rate204=7.74, Rate216=8.15, Rate228=8.07, Rate240=8.33}]
我的实际目标是按以下排序顺序生成地图
{12=0.4,24=0.63 ....}
为此我采取了静态列表
private final static List<String> period = new ArrayList<>
(Arrays.asList("Rate12","Rate24","Rate36","Rate48","Rate60","Rate72","Rate84","Rate96","Rate108","Rate120",
"Rate132","Rate144","Rate156","Rate168","Rate180","Rate192","Rate204","Rate216","Rate228","Rate240"));
然后
TreeMap<String, Float> insuranceMatrixMap = new TreeMap<String, Float>();
for(String str : period) {
insuranceMatrixMap.put(str.replaceAll("Rate", ""), ((BigDecimal) (BBUtil.getInstance().getValue(insurancePercentageDetails, str))).floatValue());
}
这给了我输出
{108=3.3, 12=0.4, 120=3.84, 132=4.4, 144=5.0, 156=5.62, 168=6.28, 180=6.97, 192=7.34, 204=7.74, 216=8.15, 228=8.07, 24=0.63, 240=8.33, 36=0.86, 48=1.12, 60=1.39, 72=1.67, 84=1.98, 96=2.31}
不按排序顺序。
TreeMap应该按照排序顺序保存密钥,不是吗?
我在这里遗漏了什么吗?
答案 0 :(得分:1)
你是对的,TreeMap将根据键进行排序。 但在你的情况下,Key是String而不是Integer。
结果根据字符串值排序,即 “108”。比较(“12”)将为负数。
字符串比较基于每个字符的Unicode值。
如果要对Integer值进行排序,则必须使用TreeMap<Integer, Float>
。
答案 1 :(得分:0)
你可以在循环之前对它进行排序:
Collections.sort(period, new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
return Integer.valueOf(o1.replaceAll("Rate", ""))
.compareTo(Integer.valueOf(o2.replaceAll("Rate", "")));
}
});