按规则排序字符串列表
Sorting String List by rules
如何使用比较器或可比较器基于 ACII table 对字符串列表进行升序或降序排序。
让我们假设一个字符串列表包含以数字 (1start) 或特殊字符 (@fill) 或小写字母 (kind) 或大写字母 (Link) 开头的单词
示例场景:
我想按此特定顺序对列表进行排序:(排序为 asc 或 desc)
- 以'lowercase'开头的单词应该首先排序,
- 以'special'字符开头的单词应排在第二位,
- 以'number'开头的单词应排在第三位,
- 以'uppercase'开头的单词应排在第四位
我会为每个 "character classes" 创建一个枚举,用一些逻辑来弄清楚 class 每个字符属于什么:
public enum CharacterClass {
LOWERCASE, SPECIAL, NUMBER, UPPERCASE;
public static CharacterClass getClass(char c) {
if (Character.isLowerCase(c)) {
return LOWERCASE;
}
if (Character.isUpperCase(c)) {
return UPPERCASE;
}
if (Character.isDigit(c)) {
return NUMBER;
}
return SPECIAL;
}
}
基于此,我们现在可以创建一个比较器,遍历两个字符串的字符并比较它们的 classes(然后是字符本身,如果它们具有相同的 class) :
public class CharacterClassComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
int l1 = o1.length();
int l2 = o2.length();
int length = Math.min(l1, l2);
for (int i = 0; i < length; ++i) {
char c1 = o1.charAt(i);
char c2 = o2.charAt(i);
// Compare the character classes
int res = CharacterClass.getClass(c1).compareTo(CharacterClass.getClass(c2));
if (res != 0) {
return res;
}
// If the clases are the same, compare the actual characters
res = Character.compare(c1, c2);
if (res != 0) {
return res;
}
}
// All the characters up to the shared length are the same
// Compare the lengths:
return Integer.compare(l1, l2);
}
}
如何使用比较器或可比较器基于 ACII table 对字符串列表进行升序或降序排序。
让我们假设一个字符串列表包含以数字 (1start) 或特殊字符 (@fill) 或小写字母 (kind) 或大写字母 (Link) 开头的单词
示例场景: 我想按此特定顺序对列表进行排序:(排序为 asc 或 desc)
- 以'lowercase'开头的单词应该首先排序,
- 以'special'字符开头的单词应排在第二位,
- 以'number'开头的单词应排在第三位,
- 以'uppercase'开头的单词应排在第四位
我会为每个 "character classes" 创建一个枚举,用一些逻辑来弄清楚 class 每个字符属于什么:
public enum CharacterClass {
LOWERCASE, SPECIAL, NUMBER, UPPERCASE;
public static CharacterClass getClass(char c) {
if (Character.isLowerCase(c)) {
return LOWERCASE;
}
if (Character.isUpperCase(c)) {
return UPPERCASE;
}
if (Character.isDigit(c)) {
return NUMBER;
}
return SPECIAL;
}
}
基于此,我们现在可以创建一个比较器,遍历两个字符串的字符并比较它们的 classes(然后是字符本身,如果它们具有相同的 class) :
public class CharacterClassComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
int l1 = o1.length();
int l2 = o2.length();
int length = Math.min(l1, l2);
for (int i = 0; i < length; ++i) {
char c1 = o1.charAt(i);
char c2 = o2.charAt(i);
// Compare the character classes
int res = CharacterClass.getClass(c1).compareTo(CharacterClass.getClass(c2));
if (res != 0) {
return res;
}
// If the clases are the same, compare the actual characters
res = Character.compare(c1, c2);
if (res != 0) {
return res;
}
}
// All the characters up to the shared length are the same
// Compare the lengths:
return Integer.compare(l1, l2);
}
}