按自然顺序比较字符串但忽略字符串的前缀
Compare strings by natural order but ignoring string's prefix
我正在努力以忽略前缀的自然顺序对字符串流(或列表,如果您愿意)进行排序。
前缀总是以 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));
假设前缀定义为 'the first 4 characters'。如果超过 'The string let
, and then any number of digits',则您必须执行其他操作。可能是正则表达式:
Comparator<String> marcosPrefixIgnoringComparison =
(a, b) -> a.replaceFirst("^let\d+\s+", "").compareTo(
b.replaceFirst("^let\d+\s+", ""));
你的问题不是特别清楚 'prefix' 是什么意思,在这里。
我正在努力以忽略前缀的自然顺序对字符串流(或列表,如果您愿意)进行排序。 前缀总是以 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));
假设前缀定义为 'the first 4 characters'。如果超过 'The string let
, and then any number of digits',则您必须执行其他操作。可能是正则表达式:
Comparator<String> marcosPrefixIgnoringComparison =
(a, b) -> a.replaceFirst("^let\d+\s+", "").compareTo(
b.replaceFirst("^let\d+\s+", ""));
你的问题不是特别清楚 'prefix' 是什么意思,在这里。