我正在尝试为TreeMap实现一个比较器,其中键条目是
形式的字符串1a
2b
11a
11b
14
16
我可以使用此正则表达式识别需要额外处理的字符串
[0-9]+[a-zA-Z]+
使用简单的[0-9] +正则表达式我可以很容易地找到字符串上的初始数字,我的问题是如何将它们拆分为让我然后分别比较整数值和字符串字符?
编辑: 样本数据高于预期输出,理想情况下是字符串数组,其中位置0是整数值,位置1是字符串值,即
[1,a]
[2,b]
[11,a]
[11,b]
答案 0 :(得分:2)
这是一种使用您建议的正则表达式的方法:
new Comparator<String>() {
Pattern p = Pattern.compile("([0-9]+)[a-zA-Z]+");
private String getNum(String s) {
Matcher m = p.matcher(s);
return m.matches() ? m.group(1) : s;
}
@Override
public int compare(String o1, String o2) {
o1 = getNum(o1);
o2 = getNum(o2);
return Integer.compare(Integer.parseInt(o1),
Integer.parseInt(o2));
}
};
如果您使用 Java 8 ,则可以执行
private static Pattern p = Pattern.compile("([0-9]+)[a-zA-Z]+");
private static int getNum(String s) {
Matcher m = p.matcher(s);
return Integer.parseInt(m.matches() ? m.group(1) : s);
}
然后使用
Comparator.comparing(YourClass::getNum))
另一种不使用你建议的正则表达式的方法是
Comparator.comparing(s -> Integer.parseInt(s.replaceAll("[a-zA-Z]", ""))));