主要是记录曾经的操作,非讲解。
/**
* 自定义的排序方法
*/
private int compareMy(String s1, String s2){
String[] arr1 = parseStrWithPattern(addHorizontalLine(s1));
String[] arr2 = parseStrWithPattern(addHorizontalLine(s2));
if(arr1[0].compareTo(arr2[0]) == 0){
if(Integer.parseInt(arr1[1]) == Integer.parseInt(arr2[1])){
if(Integer.parseInt(arr1[2]) == Integer.parseInt(arr2[2])){
if(Integer.parseInt(arr1[3]) == Integer.parseInt(arr2[3])){
if(Integer.parseInt(arr1[4]) == Integer.parseInt(arr2[4])){
return 0;
}else{
return Integer.parseInt(arr1[4]) - Integer.parseInt(arr2[4]);
}
}else{
return Integer.parseInt(arr1[3]) - Integer.parseInt(arr2[3]);
}
}else{
return Integer.parseInt(arr1[2]) - Integer.parseInt(arr2[2]);
}
}else{
return Integer.parseInt(arr1[1]) - Integer.parseInt(arr2[1]);
}
}else{
return arr1[0].compareTo(arr2[0]);
}
}
/**
* 添加横线和尾部添加0,使输入的字符串变成如下形式: abc-0-0-0-0-0
* @param input 输入字符串
*/
private String addHorizontalLine(String input){
Pattern pattern = Pattern.compile("([a-zA-Z_#\\u4e00-\\u9fa5]*)(.*)");
Matcher matcher = pattern.matcher(input);
String s1 = null;
String s2 = null;
//find()调用必不可少,否则会报错
if(matcher.find()){
s1 = matcher.group(1);
s2 = matcher.group(2);
}
if(CommonUtil.isEmpty(s1)){
s1 = "!";//取!是因为感叹号的ASCII编码很小,会让纯数字的排在前面
}
String outS = s1 + "-" + s2 + "-0-0-0-0";
return outS;
}
/**
* 按照指定的模式解析输入字符串
* 输入字符串必须符合abc-0-0-0,或者更多-0的形式
* @return 返回解析之后的字符串数组
*/
private String[] parseStrWithPattern(String input){
Pattern pattern = Pattern.compile("([a-zA-Z_#!\\u4e00-\\u9fa5]+)([\\-]+)([0-9]+)([\\-]+)([0-9]+)([\\-]+)([0-9]+)([\\-]+)([0-9]+)(.*)");
Matcher matcher = pattern.matcher(input);
String[] arr = new String[5];
if(matcher.find()){
arr[0] = matcher.group(1);
arr[1] = matcher.group(3);
arr[2] = matcher.group(5);
arr[3] = matcher.group(7);
arr[4] = matcher.group(9);
}
return arr;
}
@Test
public void test3(){
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("1-1");
list.add("1-2");
list.add("1-3");
list.add("1--1-1");
list.add("1--1-2");
list.add("10");
list.add("11");
list.add("10-1");
list.add("10-2");
list.add("10-1-1");
list.add("10-1-2");
list.add("a");
list.add("a1");
list.add("a1-1");
list.add("a1-2");
list.add("a1-1-2");
list.add("桩1");
list.add("桩1-1");
list.add("桩1-2");
list.add("桩1-2-1");
list.add("桩10");
list.add("桩1");
list.add("abc---de--ef");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
try{
return compareMy(s1, s2);
}catch (Exception e){
return s1.compareTo(s2);
}
}
});
System.out.println(list);
}