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 (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;
});
 }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM