java给乱序字符串进⾏排序
⼯作中遇到了批量选择了⼏条数据进⾏保存,但数据本⾝是有序号的(序号及其复杂并且没有规律),保存完以后就乱序了。
在没有设置权重的情况下,对这些数据进⾏排序就⽐较⿇烦了。
在此,我想到了利⽤正则表达式进⾏对序号的识别并截取,然后通过重写排序⽅法进⾏排序。
// 乱序数据
String content0 = "1.13 nex1sdnvaeye啊啊啊";
String content1 = "第2.11条 .nexdnaeye";
String content2 = "3-13 nex34tsdnjavaeye";
String content3 = "第3.14条 necsdn2ae啊ye";
String content4 = "3.点.lov是e31 nex35tsdnjavaeye";
List<String> list = new ArrayList<>();
list.add(content4);
list.add(content0);
list.add(content3);
list.add(content1);
list.add(content2);
System.out.println(list);
// 输出后的内容
// [3.点.lov是e31 nex35tsdnjavaeye, 1.13 nex1sdnvaeye啊啊啊, 第3.14条 necsdn2ae啊ye, 第2.11条 .nexdnaeye, 3-13 nex34tsdnjavaeye]
⽅案⼀:对乱序数据中,有迹可循的序号进⾏正则表达式的截取。
public static String getStartDigits(String s) {
// 发现,数据中是含有“-”(横杠)的,所以要先把“-”转为“.” ,让其变为浮点数,
来进⾏⽐较。
String str = s.replaceAll("-", ".");
// 然后通过正则来逐个匹配浮点数,浮点数缺少⼩数位的数,整数。
Matcher matcher;
if (ains(".")){
matcher = Patternpile("(\\d+[.]\\d+)").matcher(str);
if (matcher.find()){
return up(0);
} else {
matcher = Patternpile("(\\d+[.])").matcher(str);
if (matcher.find()){
return up(0);
} else {
matcher = Patternpile("\\d+").matcher(str);
return matcher.find()? up(0): "0";
}
}
} else {
matcher = Patternpile("\\d+").matcher(str);
return matcher.find()? up(0): "0";
}
}
/
/ 注:如果匹配不成功,返回0; 对⽆法识别的复杂字符串,排序之后会置前。
⽅案⼆:对排序进⾏重写
public static void setSortByStartDigits(List<String> list) {
list.sort((s1, s2) -> {
double num1 = Double.parseDouble(getStartDigits(s1));
double num2 = Double.parseDouble(getStartDigits(s2));
return num1 - num2 > 0 ? 1 : -1;
});
}
实践:
public static void main(String[] args) {
String content0 = "1.13 nex1sdnvaeye啊啊啊";
String content1 = "第2.11条 .nexdnaeye";
String content2 = "3-13 nex34tsdnjavaeye";
String content3 = "第3.14条 necsdn2ae啊ye";
String content4 = "3.点.lov是e31 nex35tsdnjavaeye";
List<String> list = new ArrayList<>();
list.add(content4);
list.add(content0);
list.add(content3);
list.add(content1);
list.add(content2);
/
/ 调⽤排序⽅法
StringSortUtil.setSortByStartDigits(list);
System.out.println(list);
}
// 输出内容
// [1.13 nex1sdnvaeye啊啊啊, 第2.11条 .nexdnaeye, 3.点.lov是e31 nex35tsdnjavaeye, 3-13 nex34tsdnjavaeye, 第3.14条 necsdn2ae啊ye]
完整⼯具类:
/*
* 字符串集合排序⼯具
*/
public class StringSortUtil {
// 取出字符串前⾯的数字
public static String getStartDigits(String s) {
String str = s.replaceAll("-", ".");
Matcher matcher;
if (ains(".")){
matcher = Patternpile("(\\d+[.]\\d+)").matcher(str);
if (matcher.find()){
return up(0);
字符串长度排序 } else {
matcher = Patternpile("(\\d+[.])").matcher(str);
if (matcher.find()){
return up(0);
} else {
matcher = Patternpile("\\d+").matcher(str);
return matcher.find()? up(0): "0";
}
}
} else {
matcher = Patternpile("\\d+").matcher(str);
return matcher.find()? up(0): "0";
}
}
/
/ 功能描述: 根据字符串集合中开头的序号进⾏排序(⽀持double)
public static void setSortByStartDigits(List<String> list) {
list.sort((s1, s2) -> {
double num1 = Double.parseDouble(getStartDigits(s1));
double num2 = Double.parseDouble(getStartDigits(s2));
return num1 - num2 > 0 ? 1 : -1;
});
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论