【String】某些特定情境下字符串排序 (改进)

本文介绍了一个使用Java实现的复杂字符串列表排序案例。该案例通过自定义Comparator实现了对包含字母和数字混合的字符串进行智能排序,使得输出结果既符合字母顺序也符合数字大小顺序。文章中的代码展示了如何解析字符串并根据不同情况进行比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * @author fangwk
 * @date 2016-7-12 11:26:34
 */
public class Hello {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("M1");
		list.add("M1/1");
		list.add("M1/12");
		list.add("M1/2");
		list.add("M12");
		list.add("M12/2");
		list.add("M2");
		list.add("M2/1");
		list.add("C1");
		list.add("C1/1");
		list.add("CT2/7");
		list.add("C12");
		list.add("CT2");
		list.add("CT2/1");
		list.add("CT2/2");
		Collections.sort(list, new Comparator<String>() {

			@Override
			public int compare(String str1, String str2) {
				String s1 = str1.split("/")[0];
				String s2 = str2.split("/")[0];
				if (s1.equals(s2)) {
					if (str1.indexOf("/") < 0) { // 如M1和M1/1
						return -1;
					} else if (str2.indexOf("/") < 0) { // 如M1/1和M1
						return 1;
					} else { // 如M1/1,M1/2
						return Integer.parseInt(str1.split("/")[1]) - Integer.parseInt(str2.split("/")[1]);
					}
				} else {
					if (s1.substring(0, getIndexOfFirstCharByReg(str1, "[0-9]"))
							.equals(s2.substring(0, getIndexOfFirstCharByReg(str2, "[0-9]")))) { // 字母部分相同,如M12,M2,则比较/之前的数字

						int num1 = str1.indexOf("/") == -1 ? str1.length() : str1.indexOf("/");
						int num2 = str2.indexOf("/") == -1 ? str2.length() : str2.indexOf("/");
						return Integer.parseInt(str1.substring(1, num1)) - Integer.parseInt(str2.substring(1, num2));
					} else {
						return s1.compareToIgnoreCase(s2); // 字母部分比较
					}
				}

			}
		});
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}

	}

	public static int getIndexOfFirstCharByReg(String target, String reg) {
		Pattern pattern = Pattern.compile(reg);
		Matcher matcher = pattern.matcher(target);
		if (matcher.find()) {
			return target.indexOf(matcher.group());
		}
		return 0;
	}

}

结果为:
C1
C1/1
C12
CT2
CT2/1
CT2/2
CT2/7
M1
M1/1
M1/2
M1/12
M2
M2/1
M12
M12/2


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值