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)
您可以编写一个自定义程序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实现假设它仅适用于看起来像一系列由句点分隔的整数的字符串。如果您打算在那里有其他字符串,您应该添加一些输入验证。
| 归档时间: |
|
| 查看次数: |
1202 次 |
| 最近记录: |