【发布时间】:2020-11-13 18:22:01
【问题描述】:
我有一个要按特定顺序排序的字符串列表。
列表是 ["Bea", "hel", "Hel", "--'", "813", "!@#", "813", "813", "Alb"]
我想让它排序如下:
[813, 813, 813, --', !@#, Alb, Bea, Hel, hel]
我有一些非常接近的代码,但仍然有一个我无法弄清楚的错误。目前该程序正在制作这个。
[813, 813, 813, Alb, --', !@#, Bea, Hel, hel]
下面是我目前拥有的代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Arrays;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("Bea", "hel", "Hel", "--'", "813", "!@#", "813", "813", "Alb");
Collections.sort(list, STANDARD_ALPHABETICAL_ORDER);
System.out.println(list);
}
public final static Comparator<String> STANDARD_ALPHABETICAL_ORDER =
(a,b) -> {
String newA = a.replaceAll("[^a-zA-Z0-9]", "");
String newB = b.replaceAll("[^a-zA-Z0-9]", "");
int na = newA.length();
int nb = newB.length();
int r;
int n;
if (na < nb) {
r = -1;
n = na;
} else if (na > nb) {
r = -1;
n = nb;
} else {
r = 0;
n = na;
}
for (int i = 0; i < n; ++i) {
char ca = newA.charAt(i);
char cb = newB.charAt(i);
if (ca != cb) {
if (Character.isDigit(ca) && !Character.isDigit(cb)) {
return -1;
} else if (!Character.isDigit(ca) && Character.isDigit(cb)) {
return 1;
} else if (ca > cb ) {
return 1;
} else {
return -1;
}
}
}
return r;
};
}
【问题讨论】:
-
您介意详细说明您的排序标准吗?
-
当然,它是按字母数字排序的。忽略(但保留)非字母数字字符。数字在字母前,大写字母在小写字母前(即 0-9、A-Z、a-z)
-
我总是将数据保存到笔记本文本文件中,然后将数据导入到 Excel 中。根据您的数据显示方式并假设您不想包含“,我将使用 delimited 与分隔符”放置另一个框。导入后,您可以将文件另存为 Excel 表格并删除不需要的列并按您的意愿排序。
-
您可以考虑使用基于 Java 规则的整理器来定义您自己的自定义排序顺序。您可以查看一个示例(针对不同的自定义排序顺序)here。
-
我将创建一个具有字符串值和排序值的对象,并在构造时从字符串值生成排序值,并根据它们的排序值对这些对象进行排序。你的代码会更干净,你会保持理智。
标签: java arrays string sorting