求个排序算法,要求对多个字符串排序,比如
acc
abc
aaa
排序后的结果为
aaa
abc
acc
但是如果字符串中有除了空格之外的其余符号,这种的优先级应该最低,比如
aaa ccc
aaa &bbb
aaa bbb
排序后的结果为
aaa bbb
aaa ccc
aaa &bbb
求算法厉害的大佬给个办法....
求个排序算法,要求对多个字符串排序,比如
acc
abc
aaa
排序后的结果为
aaa
abc
acc
但是如果字符串中有除了空格之外的其余符号,这种的优先级应该最低,比如
aaa ccc
aaa &bbb
aaa bbb
排序后的结果为
aaa bbb
aaa ccc
aaa &bbb
求算法厉害的大佬给个办法....
public static void main(String[] args) {
List<String> normalList = Arrays.asList("acc", "abc", "aaa");
List<String> containSpecialCharList = Arrays.asList("aaa ccc", "aaa &bbb", "aaa bbb");
sorted(normalList).forEach(System.out::println);
System.out.println("---------");
sorted(containSpecialCharList).forEach(System.out::println);
}
public static List<String> sorted(List<String> list) {
Stream<String> normalStream = list.stream().filter(str -> Boolean.FALSE.equals(isSpecialChar(str))).sorted(Comparator.comparing(String::new));
Stream<String> specialStream = list.stream().filter(str -> Boolean.TRUE.equals(isSpecialChar(str))).sorted(Comparator.comparing(String::new));
return Stream.of(normalStream, specialStream).flatMap(Function.identity()).collect(Collectors.toList());
}
public static boolean isSpecialChar(String str) {
String regEx = "[_`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]|\n|\r|\t";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.find();
}
以下方案以js为开发语言。
对于情况1 直接使用 Array.sort就可以做到。默认的排序规则如下。 使用默认的规则就可以了。
function compare(a, b) {
if (a < b) { // 按某种排序标准进行比较, a 小于 b
return -1;
}
if (a > b) {
return 1;
}
// a must be equal to b
return 0;
}
对于情况2 我这边给出一个正则的方案。比较双方是否包含特殊字符,如果都包含 和都不包含 根据默认规则排序,如果一个包含 一个不包含,让不包含的排在前面。
arr.sort((a, b) => {
const matchA = a.match(/[^ \da-zA-z]/)
const matchB = b.match(/[^ \da-zA-z]/)
return (!!matchA ^ !!matchB) ? (matchA ? 1 : -1) : compare(a, b)
})
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
8 回答6.5k 阅读
2 回答4.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
4 回答697 阅读✓ 已解决
这个对字符串的比较规则应该如下:
2.1. 如果两个字符串相同长度部分相同,则那个长更大
2.2 否则依次比较字符串相同位置的字符,区分普通字符(
\da-zA-z
)和其他字符来比较,如果一个是普通字符,一个是其它字符,其它字符对应的更大,如果属于同类,则直接比较字符大小。