Java字符串(包含字母和数字)通用排序

本文介绍了如何在Android中实现字符串(包括数字字符串)的比较,使用Comparator对列表进行排序,以示例的形式展示了`compareString`方法和在`SarKeyValVO`对象中的应用。
摘要由CSDN通过智能技术生成

说明:本文章是之前查到的一篇安卓版的,具体原文路径忘记了。稍微改了一点,挺符合业务使用的!

一、看代码

/**
     * 包含数字的字符串进行比较(按照从小到大排序)
     */
    private static Integer compareString(String string1, String string2) {
        //拆分两个字符串
        List<String> list1 = splitString(string1);
        List<String> list2 = splitString(string2);
        //依次对比拆分出的每个值
        int index = 0;
        while (true) {
            //相等表示两个字符串完全相等
            if (index >= Math.max(list1.size(), list2.size())) {
                return 0;
            }
            String str1 = null;
            if (index < list1.size()){
                str1 = list1.get(index);
            }else{
                str1 =  "";
            }
            String str2 = null;
            if (index < list2.size()){
                str2 = list2.get(index);
            }else{
                str2 =  "";
            }
            //字符串相等则继续判断下一组数据
            if (str1.equals(str2)) {
                index++;
                continue;
            }
            //是纯数字,比较数字大小
            if (isNum(str1) && isNum(str2)) {
                if(Integer.parseInt(str1) < Integer.parseInt(str2)){
                    return -1;
                }else{
                    return 1;
                }
            }
            // 字符串比较大小
            if(str1.compareTo(str2)>0){
                return -1;
            }else{
                return 1;
            }
        }
    }
/**
     * 是否是纯数字
     */
    private static Boolean isNum(String str){
        return Pattern.compile("\\d+").matcher(str).matches();
    }
/**
     * 拆分字符串
     * 输入:第5章第100节课
     * 返回:[第,5,章第,100,节课]
     */
    private static List<String> splitString(String str){
        Matcher matcher = Pattern.compile("([^0-9]+)|(\\d+)").matcher(str);
        List<String> list = new ArrayList<>();
        while (matcher.find()) {
            list.add(matcher.group());
        }
        return list;
    }

二、看测试

List<String> strList0 = Arrays.asList(new String[]{
	       "4","2","5","1"
	});
	Collections.sort(strList0,(o1, o2) -> compareString(o1, o2));
	System.out.println(Arrays.asList(strList0));
	// 输出:[[1, 2, 4, 5]]
	
	List<String> strList1 = Arrays.asList(new String[]{
	       "GSM 1900","GSM 1800","GSM 850","GSM 900"
	});
	Collections.sort(strList1,(o1, o2) -> compareString(o1, o2));
	System.out.println(Arrays.asList(strList1));
	// 输出:[[GSM 850, GSM 900, GSM 1800, GSM 1900]]
	
	List<String> strList2 = Arrays.asList(new String[]{
	       "6G","2.4G","5G"
	});
	Collections.sort(strList2,(o1, o2) -> compareString(o1, o2));
	System.out.println(Arrays.asList(strList2));
	// 输出:[[2.4G, 5G, 6G]]
	
	List<String> strList3 = Arrays.asList(new String[]{
	       "n78","DC_12A_n2A","n8","DC_66A_n2A","DC_1A_n77A","DC_2A_n41A"
	});
	Collections.sort(strList3,(o1, o2) -> compareString(o1, o2));
	System.out.println(Arrays.asList(strList3));
	// 输出:[n8, n78, DC_1A_n77A, DC_2A_n41A, DC_12A_n2A, DC_66A_n2A]]

三、对象测试

@Data
public class SarKeyValVO {

    private Integer key;

    private String band;
}
List<SarKeyValVO> sarKeyValVOS = new ArrayList<>();
  sarKeyValVOS.add(new SarKeyValVO(0,"GSM 1900"));
  sarKeyValVOS.add(new SarKeyValVO(1,"GSM 1800"));
  sarKeyValVOS.add(new SarKeyValVO(2,"GSM 850"));
  sarKeyValVOS.add(new SarKeyValVO(3,"GSM 900"));
  
  List<SarKeyValVO> collect = sarKeyValVOS
  .stream()
  .sorted((o1, o2) -> compareString(o1.getBand(), o2.getBand()))
  .collect(Collectors.toList());
  
  System.out.println(Arrays.asList(collect));
  // {...GSM 850}, {...GSM 900}, {...GSM 1800}, {...GSM 1900}
  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java的`Comparator`接口自定义排序规则来实现字符串按照字母数字排序。具体步骤如下: 1. 定义一个实现了`Comparator`接口的类,重写`compare`方法。 2. 在`compare`方法,对两个字符串进行比较,返回比较结果。 1. 如果两个字符串在相同位置上的字符相同,继续比较下一个字符; 2. 如果两个字符串在相同位置上的字符不同,按照字符的ASCII码大小进行比较,ASCII码小的排在前面; 3. 如果一个字符串的某个位置上没有字符,认为它的字符比另一个字符串的相应位置上的字符小,排在前面。 以下是示例代码: ```java import java.util.Arrays; import java.util.Comparator; public class StringSort { public static void main(String[] args) { String[] arr = {"a123", "c", "b", "123", "A", "B", "c123"}; Arrays.sort(arr, new MyComparator()); System.out.println(Arrays.toString(arr)); } } class MyComparator implements Comparator<String> { @Override public int compare(String o1, String o2) { int i = 0, j = 0; while (i < o1.length() && j < o2.length()) { char c1 = o1.charAt(i), c2 = o2.charAt(j); if (c1 == c2) { i++; j++; } else if (Character.isDigit(c1) && Character.isDigit(c2)) { int num1 = 0, num2 = 0; while (i < o1.length() && Character.isDigit(o1.charAt(i))) { num1 = num1 * 10 + o1.charAt(i) - '0'; i++; } while (j < o2.length() && Character.isDigit(o2.charAt(j))) { num2 = num2 * 10 + o2.charAt(j) - '0'; j++; } if (num1 != num2) { return num1 - num2; } } else { return c1 - c2; } } return o1.length() - o2.length(); } } ``` 运行结果为: ``` [A, B, a123, b, c, c123, 123] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值