按规则排序字符串列表

Sorting String List by rules

如何使用比较器或可比较器基于 ACII table 对字符串列表进行升序或降序排序。

让我们假设一个字符串列表包含以数字 (1start) 或特殊字符 (@fill) 或小写字母 (kind) 或大写字母 (Link) 开头的单词

示例场景: 我想按此特定顺序对列表进行排序:(排序为 asc 或 desc)

我会为每个 "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);
    }
}