我有一个"abc1.0","bcd1.1","xyz2.1.1","cdef1.2.1"...
,密钥是一个唯一的字符串,格式如下:
"abc1.0","bcd1.1","cdef1.2.1","xyz2.1.1",...
现在我需要使用该键对此hashmap进行排序,但是在数字顺序中按小数顺序排列:
Map<String, Integer> mp = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String key1, String key2) {
.....
//Counted decimal points and if > 2
k1 = Integer.parseInt(key1.substring(1).split("\\.")[countOfDecimals]);
//same for key2
......
}
return Double.compare(k1, k2);
}
我正在尝试使用树形图的比较器,但没有正确排序。
前:
string szDllPath = "12345";
size_t size = szDllPath.length();
TCHAR* wArr = new TCHAR[size];
for (size_t i = 0; i < size; ++i)
wArr[i] = _T(szDllPath[i]);
cout<<szDllPath<<endl;
cout<<wArr<<endl;
修改
几乎尝试了所有给出的例子是STO但没有成功:( 如果涉及两个或更多小数点,则不进行排序。请帮助!!
答案 0 :(得分:2)
尝试使用正则表达式提取所有十进制数并对其进行排序:
Map<String, Integer> mp = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String a, String b) {
return Double.compare(Double.valueOf(a.replaceAll("[^\\d+(?:\\.\\d+)?]","")),
Double.valueOf(b.replaceAll("[^\\d+(?:\\.\\d+)?]","")));
}
});
mp.put("abd10.9",6);
mp.put("abd17.02",65);
mp.put("nmbd1.02",17);
mp.put("klbd7.028",10);
mp.put("klbd7.023",9);
//升序
{nmbd1.020 = 17,klbd7.023 = 9,klbd7.028 = 10,abd10.9 = 6,abd17.02 = 65}
//以下评论中讨论的更改: //这只能在小数点长度相同的情况下才能工作,如果不是,那么应该添加零来填充剩余空间以便排序正常工作
Map<String, Integer> mp = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String a, String b) {
return Integer.compare(Integer.valueOf(a.replaceAll("\\D+","")),
Integer.valueOf(b.replaceAll("\\D+","")));
}
});
mp.put("abd10.9.0.9",6);
mp.put("gbd17.0.6.2",65);
mp.put("nmbd2.0.9.2",17);
mp.put("klbd7.0.2.7",10);
mp.put("rlbd8.1.2.8",10);
mp.put("opbd9.0.2.3",9);
mp.put("mpbd7.0.3.2",9);
mp.put("wpbd7.0.7.0",9);
输出:
{nmbd2.0.9.2 = 17,klbd7.0.2.7 = 10,mpbd7.0.3.2 = 9,wpbd7.0.7.0 = 9,rlbd8.1.2.8 = 10,opbd9.0.2.3 = 9,abd10.9.0.9 = 6,gbd17.0.6.2 = 65}
答案 1 :(得分:0)
尝试从键中的字符串中提取数字,并对树进行排序。当你最终有一个像“1.0”,“1.1”,“2.1.1”,“1.2.1”...
的列表你按它们排序它会返回你期望的顺序:
“1.0”,“1.1”,“1.2.1”,“2.1.1”
答案 2 :(得分:0)
您需要对String进行标记 - 将其拆分为:
然后使用字符串比较器比较文本,并迭代所有版本/颠覆,并使用整数比较来比较它们。
答案 3 :(得分:0)
您可以做的是从您要比较的键中提取字符串的数字部分:
例如,如果键是“abc1.5.02”和“zxy1.4.3”,那么数字部分是“1.5.02”和“1.4.3”
接下来,填充这些数字字符串的组件,使它们在每个颠覆中都有2位数。
即,
"1.5.02" --> "1.50.02.00.00" (add "00"s since you can have up to 4 decimal points)
"1.4.3" --> "1.40.30.00.00"
接下来,将这两个转换为长。
"1.50.02.00.00" --> 150,020,000 (call this val1)
"1.40.30.00.00" --> 140,300,000 (call this val2)
最后,返回Long.compare(val1, val2)