按规则对字符串列表进行排序



如何使用比较器或可比性根据ACII表对字符串列表进行升序或降序排序。

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

示例方案:我想按以下特定顺序对列表进行排序:(排序为 asc 或 desc(

  • 以"小写"开头的单词应首先排序,
  • 以"特殊"字符开头的单词应排在第二位,
  • 以"数字"开头的单词应按第三排序,
  • 以"大写"开头的单词应按顺序排序

我会为这些"字符类"中的每一个创建一个枚举,并用一些逻辑来确定每个字符属于哪个类:

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;
    }
}

基于此,我们现在可以创建一个比较器,该比较器遍历两个字符串的字符并比较它们的类(然后是字符本身,如果它们具有相同的类(:

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);
    }
}

相关内容

  • 没有找到相关文章

最新更新