gpt4 book ai didi

java - 使用比较器对包含整数的字符串进行排序

转载 作者:行者123 更新时间:2023-11-29 07:33:28 26 4
gpt4 key购买 nike

我有一个比较器,可以对包含字母和数字的字符串数组进行排序,但似乎无法识别以我正在寻找的方式对它们进行排序的正则表达式。

我用过this question作为我的比较器的引用。

array={string-a01,string-a20,string-a100,string-b01,string-b20,string-b100,string-c01,string-c20,string-c100 etc.}

Collections.sort(array, new Comparator<String>(){
public int compare(String o1, String o2) {
return extractInt(o1) - extractInt(o2);
}

int extractInt(String s) {
String num = s.replaceAll("\\D", "");
return num.isEmpty() ? 0 : Integer.parseInt(num);
}
});

for (String element : array) {
System.out.println(element);
}

在引入比较器之前,输出是:
字符串-a01、字符串-a100、字符串-a20、字符串-b01、字符串-b100、字符串-b20、字符串-c01、字符串-c20、字符串-c100

这段代码产生的输出是:
字符串-a01、字符串-b01、字符串-c01 字符串-a20、字符串-b20、字符串-c20 字符串-a100、字符串-b100、字符串-c100

我希望它产生的输出是:
字符串-a01、字符串-a20、字符串-a100、字符串-b01、字符串-b20、字符串-b100、字符串-c01、字符串-c20、字符串-c100


编辑:编辑以澄清。添加比较器之前,数组已更改并输出。

最佳答案

假设 string 部分实际上不仅仅是 "string"。您可以提取结尾的字母部分和数字部分,并使用复合比较器比较它们:

String[] array = { "string-a20", "string-a01", "string-b01",
"string-b20", "string-c01", "string-c20",
"string-a100", "string-b100", "string-c100" };

Pattern p = Pattern.compile("^.*?-([A-Za-z]+)(\\d+)$");

List<String> result = Arrays.stream(array)
.map(p::matcher)
.filter(Matcher::find)
.sorted(Comparator.comparing((Matcher m) -> m.group(1)) // Compare the letter part
.thenComparingInt(m -> Integer.parseInt(m.group(2)))) // Compare the number part
.map(m -> m.group(0)) // Map back to String
.collect(Collectors.toList());

System.out.println(result);

输出:

[string-a01, string-a20, string-a100, string-b01, string-b20, string-b100, string-c01, string-c20, string-c100]

旧版(缺点是必须重新创建 Matcher):

Arrays.sort(array, new Comparator<String>() {

Pattern p = Pattern.compile("^.*?-([A-Za-z]+)(\\d+)$");

@Override
public int compare(String o1, String o2) {
Matcher m1 = p.matcher(o1);
Matcher m2 = p.matcher(o2);

if(!(m1.find() && m2.find()))
return 0; // Or throw a format exception

int comparison = m1.group(1).compareTo(m2.group(1));
return comparison != 0
? comparison
: Integer.compare(Integer.parseInt(m1.group(2)), Integer.parseInt(m2.group(2)));
}

});

关于java - 使用比较器对包含整数的字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39022514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com