Java字符串列表自定义排序问题:忽略首词、含整数元素后置
解决方法
首先,我们需要调整排序逻辑,分两步处理:先识别出需要后置的元素(第二个或第三个单词包含数字的字符串),再对有效元素按规则排序,最后把无效元素追加到列表末尾。
步骤拆解
- 识别无效元素:写一个辅助方法检查单词里是否包含数字——只要第二个或第三个单词带数字,这个字符串就属于无效元素,得放到最后。
- 定制排序规则:在比较器里先处理无效元素的优先级,再对有效元素按照第二个+第三个单词的字典序排序。
完整代码实现
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
相关产品推荐
相关产品推荐

