[10-4, 10-4-8, 12-18-7, 12-18-2, 12-18-3, 12-18-4, 12-18-5, 6-4-1, 12-3-10, 10-6-7-4-3, 10-6-7-4-2, 12-3-12, 10-6-7-4-1, 12-3-11, 7-78-1-7, 7-78-1-6, 12-71-4, 12-71-3, 12-71-2, 12-3-14, 7-78-1-3, 12-3-13]排序前
[6-4-1, 7-78-1-3, 7-78-1-6, 7-78-1-7, 10-4, 10-4-8, 10-6-7-4-1, 10-6-7-4-2, 10-6-7-4-3, 12-3-10, 12-3-11, 12-3-12, 12-3-13, 12-3-14, 12-18-2, 12-18-3, 12-18-4, 12-18-5, 12-18-7, 12-71-2, 12-71-3, 12-71-4]排序后
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> arr = new ArrayList<>();
arr.add("10-4");
arr.add("10-4-8");
arr.add("12-18-7");
arr.add("10-6-7-4-3");
Collections.sort(arr,new SelfDefineComparator());
for(String s: arr){
System.out.println(s);
}
}
// 自定义比较规则
static class SelfDefineComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
String[] o1Split = o1.split("-");
String[] o2Split = o2.split("-");
for(int i=0; i<o1Split.length; i++) {
int o1Int = Integer.parseInt(o1Split[i]);
// o2比o1短且前面相同,则o2要在o1前面,也就是o2<o1,比如 o2:10-3 o1:10-3-5
if(i == o2Split.length){
return 1;
}
int o2Int = Integer.parseInt(o2Split[i]);
// o1大于o2,o1要在o2前面
if(o1Int > o2Int){
return 1;
// o1小于o2,o1要在o2后面
}else if(o1Int < o2Int){
return -1;
}
}
// 否则就是全部相同,不交换
return 0;
}
}
}
暴力解法,全部String形式 数组每一项 全部 split("-") 数组的值全部存入 Map<String,Interge>
for example:
[10-4,10-4-8]
map.put("array:1-index:1",10);
map.put("array:1-index:2",4);
map.put("array:2-index:1",10);
map.put("array:2-index:2",4);
map.put("array:2-index:3",8);
一:map遍历取第一位排序(1.可以自定义排序 2.也可以转成List通过list的sort方法进行排序)
二:第一位相同的通过第二位排序,依次比对即可
public int compareTo(String one,String two){
String[] arr1 = one.split("-");
String[] arr2 = two.split("-");
int len1 = arr1.length;
int len2 = arr2.length;
int min = Math.min(len1,len2);
String str1,str2;
for (int i=0;i<min;i++){
str1 = arr1[i];
str2 = arr2[i];
if(str1.equals(str2)){
continue;
}
if(str1.length()!= str2.length()){
return str1.length() - str2.length();
}
return str1.compareTo(str2);
}
return len1 - len2;
}
public int compareTo(String one,String two){
String[] arr1 = one.split("-");
String[] arr2 = two.split("-");
int len1 = arr1.length;
int len2 = arr2.length;
int min = Math.min(len1,len2);
String str1,str2;
for (int i=0;i<min;i++){
str1 = arr1[i];
str2 = arr2[i];
// 相等比较下一组
if(str1.equals(str2)){
continue;
}
//长度不一样,位数多的数字大 比如100 99,最小的三位数要比两位数大
if(str1.length()!= str2.length()){
return str1.length() - str2.length();
}
// 长度一致且不相等,直接调用compareTo即可
return str1.compareTo(str2);
}
// 前面都一样,位数多的更大
return len1 - len2;
}