使用Java将列表值按实际顺序添加到树映射中

使用Java将列表值按实际顺序添加到树映射中,java,treemap,Java,Treemap,我有以下方式的贴图对象列表 List<Map<String, Object>> insurancePercentageDetails = dao.getinusrancePercentageDetails(age); 我的实际目标是按照以下顺序创建一个地图 {12=0.4,24=0.63 ....} 为此,我采用了一个静态列表 private final static List<String> period = new ArrayList<>

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

List<Map<String, Object>> insurancePercentageDetails = dao.getinusrancePercentageDetails(age);
我的实际目标是按照以下顺序创建一个地图

{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"));
没有按顺序排列

树形图应该使键按顺序排列,不是吗


我在这里遗漏了什么吗?

您可以在循环之前对其进行排序:

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

您是对的,TreeMap将根据键进行排序。 但在您的例子中,键是字符串而不是整数

并根据字符串值对结果进行排序,即。 108.12将是负数

字符串比较基于每个字符的Unicode值。
如果要按整数值排序,必须使用TreeMap

它按排序顺序排列,但根据字符串排序规则值,而不是数字顺序。如果希望按数字顺序排序,则应将键更改为整数,或提供一个自定义比较器,以提供正确的顺序。@JimGarrison,您是对的。我将TreeMap insuranceMatrixMap更改为TreeMap insuranceMatrixMap。请把这个写在答案里。我会接受的,请核对吉姆的答案。这个解决方案已经足够了。谢谢你的回复
    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}
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", "")));
            }
        });