工作中遇到了批量选择了几条数据进行保存,但数据本身是有序号的(序号及其复杂并且没有规律),保存完以后就乱序了。
在没有设置权重的情况下,对这些数据进行排序就比较麻烦了。
在此,我想到了利用正则表达式进行对序号的识别并截取,然后通过重写排序方法进行排序。
// 乱序数据 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.replace("-", "."); // 然后通过正则来逐个匹配浮点数,浮点数缺少小数位的数,整数。 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); 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.replace("-", "."); 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); 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; }); } } |