使用Java以实际顺序将列表值添加到Treemap

时间:2017-11-26 05:13:10

标签: java treemap

我有以下方式的地图对象列表

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应该按照排序顺序保存密钥,不是吗?

我在这里遗漏了什么吗?

2 个答案:

答案 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", "")));
            }
        });