如何对地图集合的层次键进行排序?

isl*_*din 1 java sorting collections dictionary

我在对以下键值列表(地图)进行排序时遇到问题。考虑按预期排序键将解决我的问题。

预期输出

Key         Value
1           animal
1.1         dog
1.1.1       tommy
1.1.2       Lily
1.1.10      Sadie
1.2         cat
1.3         camel
1.3.2       camel2
1.3.11      camel11
Run Code Online (Sandbox Code Playgroud)

我尝试了 TreeMap 但它对每个字符编号进行排序。如果需要对字符串中的整数进行排序,将使用什么代替。我想要像上面提到的那样的预期输出。

TreeMap<String, String> data = new TreeMap<String, String>();       
data.put("1",   "animal");
data.put("1.1", "dog");
data.put("1.2", "cat");     
data.put("1.3", "camel");

data.put("1.3.2", "camel2");
data.put("1.3.11", "camel11");

data.put("1.1.1", "tommy");
data.put("1.1.2", "Lily");
data.put("1.1.10", "Sadie");


SortedSet<String> keys = new TreeSet<String>(data.keySet());

System.out.println("Key         Value");

for(String key: keys){
    System.out.println(key+"        "+data.get(key));
Run Code Online (Sandbox Code Playgroud)

实际产量

 Key        Value
1       animal
1.1         dog
1.1.1       tommy
1.1.10      Sadie
1.1.2       Lily
1.2         cat
1.3         camel
1.3.11      camel11
1.3.2       camel2
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 6

您可以编写一个自定义程序Comparator,按句点分解键字符串并将每个元素视为int

public class VersionStringComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        String[] s1parts = s1.split("\\.");
        String[] s2parts = s2.split("\\.");
        int commonLength = Math.min(s1parts.length, s2parts.length);

        // Loop and compare corresponding parts
        for (int i = 0; i < commonLength; ++i) {
            int partCompare = 
                Integer.compare(Integer.parseInt(s1parts[i]),
                                Integer.parseInt(s2parts[i]));
            if (partCompare != 0) {
                return partCompare;
            }
        }

        // Out of parts - the shorter array should come first
        return Integer.compare(s1parts.length, s2parts.length);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以将其Comparator用于TreeMap

TreeMap<String, String> data = new TreeMap<>(new VersionStringComparator()); 
Run Code Online (Sandbox Code Playgroud)

或者一个TreeSet

TreeSet<String> keys = new TreeSet<>(new VersionStringComparator()); 
Run Code Online (Sandbox Code Playgroud)

请注意,此VersionStringComparator实现假设它仅适用于看起来像一系列由句点分隔的整数的字符串。如果您打算在那里有其他字符串,您应该添加一些输入验证。