提示:对数字+字符串,中文一二三四…格式字符串去重,排序,重组. 可以对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;
}
}