java - 按自然顺序比较字符串,但忽略字符串的前缀
问题描述
我正在努力以自然顺序对字符串流(或列表,如果您愿意)进行排序,忽略前缀。前缀始终以let开头,后面可以跟任何数字(例如 let12 或 let3021)
样本输入:
let3 art zero
let2 own kit dig
let1 art can
示例所需的输出:
let1 art can
let3 art zero
let2 own kit dig
因此,我尝试过的一个简单想法是执行以下操作:
list.stream().sorted();
但是数字妨碍了,产生以下输出:
let1 art can
let2 own kit dig
let3 art zero
如何以简单的方式实现此结果?理想的解决方案是比较器,或者我可以在流中使用的任何东西。
注意:我尝试使用 Comparator 失败了,因为前缀可以是任意长度。
感谢您的时间。
解决方案
您正在回答自己的问题:使用比较器。
Comparator<String> marcosPrefixIgnoringComparison =
(a, b) -> a.substring(4).compareTo(b.substring(4));
这是假设前缀被定义为“前 4 个字符”。如果它更多的是 'The string let
,然后是任意数量的数字',你必须做其他事情。可能是正则表达式:
Comparator<String> marcosPrefixIgnoringComparison =
(a, b) -> a.replaceFirst("^let\\d+\\s+", "").compareTo(
b.replaceFirst("^let\\d+\\s+", ""));
您的问题在这里并不是特别清楚“前缀”的含义。
推荐阅读
- sql - 将列转换为行值的表转置
- node.js - Angular Universal - 服务器和客户端中的不同 URL 类
- android - 如何使用嵌套的 Json 数组响应解析 Json 对象
- regex - 正则表达式模式不匹配
- java - IndexOutOfBoundsException error while trying to print first 4 elements of an ArrayList
- bash - 即使 `bashrc` 中存在路径,也无法运行路径中的任何文件
- node.js - 尝试在 docker 容器中运行 composer-rest-server 时出现节点 EACCESS 错误
- python - Python Gurobi:无法向模型添加约束
- go - 在 Golang 中比较两张地图
- angular - 悬停一个项目以显示特定于它的 div