Java更好的字符串排序(字母顺序+数字⼤⼩排序)
⽬标实现排序效果
问题
业务要求对录⼊的楼栋名称进⾏⼀个更符合⽤户想法的排序,但名称中可能夹杂着各种字母和中⽂,如果直接⽤java⾃带的字符串排序,可能结果不尽⼈意,
代码如下:
List<String> strList = Arrays.asList(new String[]{"5栋","7栋","4栋","15栋","24栋","涉外国际7栋","涉外国际6栋","B666栋","B17栋","B1栋","A45栋","A22栋" });
System.out.println(strList);
Collections.sort(strList,(o1, o2)-> o1pareTo(o2));
System.out.println("排序后");
System.out.println(strList);
排序结果:
默认的字符串⽐较排序不会考虑多个数字的情况,像字符串"15"就⽐“4”⼩,因为第⼀个字符“1”⽐“4”对应的ASCII的顺序要⼩思路
这显然不是咱们想要的结果,于是咱们可以重写⽐较器来实现嵌套数字的字符串的⽐较,为其他字符的部分按字符⽐较,为数字的部分,转换成数字进⾏⽐较
代码如下:
List<String> strList = Arrays.asList(new String[]{"5栋","7栋","4栋","15栋","24栋","涉外国际7栋","涉外国际6栋","B666栋","B17栋","B1栋","A45栋","A22栋" });
System.out.println(strList);
Collections.sort(strList,(str1, str2)->{
// 处理数据为null的情况
if(str1 ==null&& str2 ==null){
return0;
}
if(str1 ==null){
return-1;
}
if(str2 ==null){
return1;
}
/
/ ⽐较字符串中的每个字符
char c1;
char c2;
// 逐字⽐较返回结果
for(int i =0; i < str1.length(); i++){
c1 = str1.charAt(i);
try{
c2 = str2.charAt(i);
}catch(StringIndexOutOfBoundsException e){// 如果在该字符前,两个串都⼀样,str2更短,则str1较⼤
return1;
}
// 如果都是数字的话,则需要考虑多位数的情况,取出完整的数字字符串,转化为数字再进⾏⽐较
if(Character.isDigit(c1)&& Character.isDigit(c2)){
String numStr1 ="";
String numStr2 ="";
// 获取数字部分字符串
for(int j = i; j < str1.length(); j++){
c1 = str1.charAt(j);
if(!Character.isDigit(c1)){// 不是数字则直接退出循环
break;
}
numStr1 += c1;
}
for(int j = i; j < str2.length(); j++){
c2 = str2.charAt(j);
if(!Character.isDigit(c2)){
break;
}
numStr2 += c2;
}
// 转换成数字进⾏⽐较
return Integer.valueOf(numStr1)pareTo(Integer.valueOf(numStr2));
java valueof
}
/
/ 不是数字的⽐较⽅式
if(c1 != c2){
return c1 - c2;
}
}
return0;
});
System.out.println("排序后");
System.out.println(strList);
结果如图所⽰:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。