工作中遇到了批量選擇了幾條數據進行保存,但數據本身是有序號的(序號及其復雜並且沒有規律),保存完以后就亂序了。
在沒有設置權重的情況下,對這些數據進行排序就比較麻煩了。
在此,我想到了利用正則表達式進行對序號的識別並截取,然后通過重寫排序方法進行排序。
// 亂序數據 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; }); } } |