java - 按自然顺序比较字符串但忽略字符串的前缀

标签 java sorting java-stream comparator

我正在努力按自然顺序对字符串流(或列表,如果您愿意)进行排序,忽略前缀。 前缀始终以 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<String> marcosPrefixIgnoringComparison =
    (a, b) -> a.substring(4).compareTo(b.substring(4));

假设前缀定义为“前 4 个字符”。如果它更多是“字符串let,然后是任意数量的数字”,那么您就必须做其他事情。可能是正则表达式:

Comparator<String> marcosPrefixIgnoringComparison =
    (a, b) -> a.replaceFirst("^let\\d+\\s+", "").compareTo(
      b.replaceFirst("^let\\d+\\s+", ""));

您的问题在这里对于“前缀”的含义不是特别清楚。

关于java - 按自然顺序比较字符串但忽略字符串的前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66154136/

相关文章:

java - 以线性方式映射对象列表

java - Java 导入语句错误 "The import javax.validation.constraints.NotNull cannot be resolved"

algorithm - 在排序数组中搜索比二进制搜索复杂度低

vb.net - 将 DataTable 排序在人口之后

node.js - 在 NodeJs 中合并一个非常大的列表的最佳方法是什么?

java - 带有 Consumer 或 Filter 的 Java8 List 的条件,哪种方式更好

java - 从 Web 服务内部调用 Web 服务并且不等待响应

java - select 语句给出字符串变量错误

Java将json字符串转为utf 8字符串

java - 使用 Java 8 流来转换具有空值的 Map