You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java字符串列表自定义排序问题:忽略首词、含整数元素后置

解决方法

首先,我们需要调整排序逻辑,分两步处理:先识别出需要后置的元素(第二个或第三个单词包含数字的字符串),再对有效元素按规则排序,最后把无效元素追加到列表末尾。

步骤拆解

  1. 识别无效元素:写一个辅助方法检查单词里是否包含数字——只要第二个或第三个单词带数字,这个字符串就属于无效元素,得放到最后。
  2. 定制排序规则:在比较器里先处理无效元素的优先级,再对有效元素按照第二个+第三个单词的字典序排序。

完整代码实现

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

public class OrderSorter {
    public static List<String> sortOrders(List<String> orderList) {
        Collections.sort(orderList, (a, b) -> {
            // 把字符串拆成三个单词,\\s+适配任意数量的空格分隔
            String[] partsA = a.split("\\s+", 3);
            String[] partsB = b.split("\\s+", 3);
            
            // 判断当前字符串是否为无效元素(第二个/第三个单词含数字)
            boolean isAInvalid = hasDigit(partsA[1]) || hasDigit(partsA[2]);
            boolean isBInvalid = hasDigit(partsB[1]) || hasDigit(partsB[2]);
            
            // 处理无效元素的后置逻辑
            if (isAInvalid && !isBInvalid) {
                return 1; // A是无效元素,排到B后面
            }
            if (!isAInvalid && isBInvalid) {
                return -1; // B是无效元素,排到A后面
            }
            
            // 两者都是有效元素:按第二个+第三个单词的字典序排序
            if (!isAInvalid) {
                String sortKeyA = partsA[1] + " " + partsA[2];
                String sortKeyB = partsB[1] + " " + partsB[2];
                return sortKeyA.compareTo(sortKeyB);
            }
            
            // 两者都是无效元素:保持原有的相对顺序(稳定排序)
            return 0;
        });
        return orderList;
    }
    
    // 辅助方法:检查单词是否包含数字字符
    private static boolean hasDigit(String word) {
        for (char c : word.toCharArray()) {
            if (Character.isDigit(c)) {
                return true;
            }
        }
        return false;
    }
}

代码说明

  • 字符串拆分:用split("\\s+", 3)确保把字符串精准拆成三个部分,避免多个空格导致的拆分错误。
  • 无效元素判断:hasDigit方法直接遍历字符检查数字,比正则表达式在数据量大时更高效。
  • 排序逻辑:
    • 无效元素优先级最低,直接放到所有有效元素后面;
    • 有效元素通过拼接第二个和第三个单词做字典序比较,和你原本的需求完全匹配;
    • 无效元素之间保持原有顺序,符合常规的稳定排序预期。

测试示例

输入列表:

List<String> orders = Arrays.asList("19th apple orange", "17th admin 7th", "19th apple table");

调用sortOrders后输出:

["19th apple orange", "19th apple table", "17th admin 7th"]

完全符合你的需求。

内容的提问来源于stack exchange,提问作者kaka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:07:48