JAVA对数字+字符串,中文一二三四等特殊格式字符串进行特殊排序

提示:对数字+字符串,中文一二三四…格式字符串去重,排序,重组. 可以对customSort 类的46,53行进行修改,查看新排序效果

在这里插入图片描述

代码如下 (示例):

1.SortTest 类:

package api.impl;

import com.sun.deploy.util.StringUtils;

import java.util.*;

/**
 * @title: SortTest
 * @projectName SortTest
 * @description: TODO
 */
public class SortTest {
    public static void main(String[] args) {

        String newspaperNumber = "七年级上Units1-8听说,七年级下Unit1听说,七年级下Unit2听说,七年级下Unit3听说,七年级下Unit4听说,七年级下Unit5听说,七年级下Unit6听说,七年级下Unit7听说,七年级下Unit8听说,七年级下Units1-8听说,七年级下期中一听说,七年级下期中二听说,七年级下期中听说,七年级下期末一听说,七年级下期末二听说,七年级下期末听说,专项复习合刊,中考专项复习合刊,中考基础知识复习合刊一,中考基础知识复习合刊二,九年级上Units1-8听说,九年级下Unit1听说,九年级下Unit2听说,九年级下Unit3听说,九年级下Unit4听说,九年级下Unit5听说,九年级下Unit6听说,九年级下Units1-6听说,八年级上Units1-8听说,八年级下Unit1听说,八年级下Unit2听说,八年级下Unit3听说,八年级下Unit4听说,八年级下Unit5听说,八年级下Unit6听说,八年级下Unit7听说,八年级下Unit8听说,八年级下Units1-2听说,八年级下Units1-8听说,八年级下Units5-6听说,八年级下期中一听说,八年级下期中二听说,八年级下期中听说,八年级下期末一听说,八年级下期末二听说,八年级下期末听说,教材学习合刊七下Unit1-Unit4,教材学习合刊七下Unit5-Unit8,教材学习合刊八下Unit1-Unit4,教材学习合刊八下Unit5-Unit8,第10期,第11期,第12期,第13期,第14期,第15期,第16期,第17期,第18期,第19期,第1期,第20期,第21期,第22期,第23期,第24期,第25期,第26期,第27期,第28期,第29期,第2期,第30期,第31期,第32期,第33期,第34期,第35期,第36期,第37期,第38期,第39期,第3期,第40期,第41期,第42期,第43期,第44期,第45期,第46期,第47期,第48期,第49期,第4期,第50期,第51期,第52期,第5期,第6期,第7期,第8期,第9期,综合复习评估一听说,综合复习评估七听说,综合复习评估三听说,综合复习评估九听说,综合复习评估二听说,综合复习评估五听说,综合复习评估八听说,综合复习评估六听说,综合复习评估十听说,综合复习评估四听说,综合模拟训练一听说,综合模拟训练三听说,综合模拟训练二听说,综合模拟训练五听说,综合模拟训练六听说,综合模拟训练四听说";

        List<String> strings = Arrays.asList(newspaperNumber.split(","));
        System.out.println("原" + strings);

        //去重
        Set<String> newSet4 = new HashSet<>(strings);
        System.out.println("去重后" + newSet4);

        //排序
        List<String> strList1 = setSort1(newSet4);
        System.out.println("排序后" + strList1);

        //重组
        List<String> lists = splitList1(strList1);
        System.out.println("重组后" + lists);

    }

    public static List<String> splitList1(List<String> messagesList) {

        //重组期数 存在对应属性进行切割重组
        List<String> newList = new ArrayList<>();
        if (messagesList != null && messagesList.size() > 0) {
            if (messagesList.contains("第1期")) {
                int one = messagesList.indexOf("第1期");
                List<String> strings = messagesList.subList(0, one);
                List<String> strings1 = messagesList.subList(one, messagesList.size());
                newList.addAll(strings1);
                newList.addAll(strings);
            } else {
                newList = messagesList;
            }
        }
        return newList;
    }


    //排序
    public static List<String> setSort1(Set<String> set) {

        String a = StringUtils.join(set, ",");

        a = a.replace("一", "000");
        a = a.replace("二", "001");
        a = a.replace("三", "002");
        a = a.replace("四", "003");
        a = a.replace("五", "004");
        a = a.replace("六", "005");
        a = a.replace("七", "006");
        a = a.replace("八", "007");
        a = a.replace("九", "008");
        a = a.replace("十", "009");

        List<String> list1 = Arrays.asList(a.split(","));

        List<String> newList = customSort.getNewList(list1);

        String a1 = StringUtils.join(newList, ",");

        a1 = a1.replace("000", "一");
        a1 = a1.replace("001", "二");
        a1 = a1.replace("002", "三");
        a1 = a1.replace("003", "四");
        a1 = a1.replace("004", "五");
        a1 = a1.replace("005", "六");
        a1 = a1.replace("006", "七");
        a1 = a1.replace("007", "八");
        a1 = a1.replace("008", "九");
        a1 = a1.replace("009", "十");

        List<String> strings = Arrays.asList(a1.split(","));

        return strings;

    }

}

2. customSort 类

package api.impl;

import java.util.Collections;
import java.util.List;

/**
 * @title: customSort
 * @projectName YdRm
 * @description: TODO
 */
public final class customSort {


    public static List<String> getNewList(List<String> strList) {

        Collections.sort(strList, (str1, str2) -> {
            // 处理数据为null的情况
            if (str1 == null && str2 == null) {
                return 0;
            }
            if (str1 == null) {
                return -1;
            }
            if (str2 == null) {
                return 1;
            }
            // 比较字符串中的每个字符
            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较大
                    return -1;
                }
                // 如果都是数字的话,则需要考虑多位数的情况,取出完整的数字字符串,转化为数字再进行比较
                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) && c1 != '.') { // 不是数字则直接退出循环
                            continue;
                        }
                        numStr1 += c1;
                    }
                    for (int j = i; j < str2.length(); j++) {
                        c2 = str2.charAt(j);
                        if (!Character.isDigit(c2) && c2 != '.') { // 考虑可能带小数的情况
                            continue;
                        }
                        numStr2 += c2;
                    }
                    // 转换成数字数组进行比较 适配 1.25.3.5 这种情况
                    String[] numberArray1 = numberStrToNumberArray(numStr1);
                    String[] numberArray2 = numberStrToNumberArray(numStr2);
                    return compareNumberArray(numberArray1, numberArray2);
                }

                // 不是数字的比较方式
                if (c1 != c2) {
                    return c1 - c2;
                }
            }
            return 0;
        });

        return strList;
    }

    /**
     * 数字字符串转数字数组
     * 适配 1.25.3.5 这种情况 ,同时如果不不包含小数点【整数情况】
     *
     * @return
     */
    public static String[] numberStrToNumberArray(String numberStr) {
        // 按小数点分割字符串数组
        String[] numberArray = numberStr.split("\\.");
        // 长度为0说明没有小数点,则整个字符串作为第一个元素
        if (numberArray.length == 0) {
            numberArray = new String[]{numberStr};
        }
        return numberArray;

    }

    /**
     * 比较两个数字数组
     *
     * @param numberArray1
     * @param numberArray2
     * @return
     */
    public static int compareNumberArray(String[] numberArray1, String[] numberArray2) {
        for (int i = 0; i < numberArray1.length; i++) {
            if (numberArray2.length < i + 1) { // 此时数字数组2比1短,直接返回
                return 1;
            }
            int compareResult = Integer.valueOf(numberArray1[i]).compareTo(Integer.valueOf(numberArray2[i]));
            if (compareResult != 0) {
                return compareResult;
            }
        }
        // 说明数组1比数组2短,返回小于
        return -1;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值