随笔 - 3,  文章 - 0,  评论 - 0,  阅读 - 1763

工作中遇到了批量选择了几条数据进行保存,但数据本身是有序号的(序号及其复杂并且没有规律),保存完以后就乱序了。

在没有设置权重的情况下,对这些数据进行排序就比较麻烦了。

在此,我想到了利用正则表达式进行对序号的识别并截取,然后通过重写排序方法进行排序。

// 乱序数据
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 (str.contains(".")){
matcher = Pattern.compile("(\\d+[.]\\d+)").matcher(str);
if (matcher.find()){
return matcher.group(0);
} else {
matcher = Pattern.compile("(\\d+[.])").matcher(str);
if (matcher.find()){
return matcher.group(0);
} else {
matcher = Pattern.compile("\\d+").matcher(str);
return matcher.find()? matcher.group(0): "0";
}
}
} else {
matcher = Pattern.compile("\\d+").matcher(str);
return matcher.find()? matcher.group(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 (str.contains(".")){
  matcher = Pattern.compile("(\\d+[.]\\d+)").matcher(str);
  if (matcher.find()){
   return matcher.group(0);
   } else {
   matcher = Pattern.compile("(\\d+[.])").matcher(str);
   if (matcher.find()){
   return matcher.group(0);
   } else {
   matcher = Pattern.compile("\\d+").matcher(str);
   return matcher.find()? matcher.group(0): "0";
   }
   }
  } else {
   matcher = Pattern.compile("\\d+").matcher(str);
  return matcher.find()? matcher.group(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;
});
 }
}
posted on   狸语  阅读(594)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示