如何以最佳方式对 Hashmap 中的字母数字键进行排序?
How to sort alphanumeric keys in Hashmap in best possible manner?
我有地图
Map<String,Integer> mp = new TreeMap<>();
mp.put("R1", 00);
mp.put("R0", 11);
mp.put("R2", 22);
mp.put("R3", 33);
mp.put("R5", 55);
mp.put("R8", 88);
mp.put("R4", 44);
mp.put("R6", 66);
mp.put("R9", 99);
mp.put("R7", 77);
mp.put("R11", 1111);
mp.put("R14", 1414);
mp.put("R10", 1010);
mp.put("R12", 1212);
mp.put("R13", 1313);
mp.put("R15", 1515);
mp.put("R17", 1717);
mp.put("R19", 1919);
我想根据键进行排序。由于字母数字,TreeMap 无法正常工作,正在获取输出
{R0=11, R1=0, R10=1010, R11=1111, R12=1212, R13=1313, R14=1414, R15=1515, R17=1717, R19=1919, R2=22, R3=33, R4=44, R5=55, R6=66, R7=77, R8=88, R9=99}
建议怎么做?
您可以从 Map
创建 Set
个 Entry
个对象。然后将自定义 Comparator
与 Set
一起传递给 Collections.sort()
。我有下面的模板。
Set<Entry<String, Integer>> set = map.entrySet();
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);
Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
{
public int compare( Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2 )
{
// Put your logic here for sorting.
}
} );
您可以使用 String
中的 regex
或 substring
方法将字符和数字与 String
中的字符和数字分开。
创建并传递给您的 TreeMap 比较器,它将只比较键的整数部分(假设所有键的形式都是 R[number]
)。
在Java 8 你的地图可以看起来像
Map<String, Integer> mp = new TreeMap<>(
Comparator.comparingInt(key -> Integer.parseInt(key.substring(1))));
在Java7中你可以使用重写为
Map<String, Integer> mp = new TreeMap<>(new Comparator<String>(){
@Override
public int compare(String key1, String key2) {
//parse only text after first letter
int k1 = Integer.parseInt(key1.substring(1));
int k2 = Integer.parseInt(key2.substring(1));
return Integer.compare(k1, k2);
}
});
它将按以下方式对元素进行排序:
{R0=11, R1=0, R2=22, R3=33, R4=44, R5=55, R6=66, R7=77, R8=88, R9=99, R10=1010, R11=1111, R12=1212, R13=1313, R14=1414, R15=1515, R17=1717, R19=1919}
我有地图
Map<String,Integer> mp = new TreeMap<>();
mp.put("R1", 00);
mp.put("R0", 11);
mp.put("R2", 22);
mp.put("R3", 33);
mp.put("R5", 55);
mp.put("R8", 88);
mp.put("R4", 44);
mp.put("R6", 66);
mp.put("R9", 99);
mp.put("R7", 77);
mp.put("R11", 1111);
mp.put("R14", 1414);
mp.put("R10", 1010);
mp.put("R12", 1212);
mp.put("R13", 1313);
mp.put("R15", 1515);
mp.put("R17", 1717);
mp.put("R19", 1919);
我想根据键进行排序。由于字母数字,TreeMap 无法正常工作,正在获取输出
{R0=11, R1=0, R10=1010, R11=1111, R12=1212, R13=1313, R14=1414, R15=1515, R17=1717, R19=1919, R2=22, R3=33, R4=44, R5=55, R6=66, R7=77, R8=88, R9=99}
建议怎么做?
您可以从 Map
创建 Set
个 Entry
个对象。然后将自定义 Comparator
与 Set
一起传递给 Collections.sort()
。我有下面的模板。
Set<Entry<String, Integer>> set = map.entrySet();
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);
Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
{
public int compare( Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2 )
{
// Put your logic here for sorting.
}
} );
您可以使用 String
中的 regex
或 substring
方法将字符和数字与 String
中的字符和数字分开。
创建并传递给您的 TreeMap 比较器,它将只比较键的整数部分(假设所有键的形式都是 R[number]
)。
在Java 8 你的地图可以看起来像
Map<String, Integer> mp = new TreeMap<>(
Comparator.comparingInt(key -> Integer.parseInt(key.substring(1))));
在Java7中你可以使用重写为
Map<String, Integer> mp = new TreeMap<>(new Comparator<String>(){
@Override
public int compare(String key1, String key2) {
//parse only text after first letter
int k1 = Integer.parseInt(key1.substring(1));
int k2 = Integer.parseInt(key2.substring(1));
return Integer.compare(k1, k2);
}
});
它将按以下方式对元素进行排序:
{R0=11, R1=0, R2=22, R3=33, R4=44, R5=55, R6=66, R7=77, R8=88, R9=99, R10=1010, R11=1111, R12=1212, R13=1313, R14=1414, R15=1515, R17=1717, R19=1919}