求个排序算法

求个排序算法,要求对多个字符串排序,比如

acc
abc
aaa

排序后的结果为

aaa
abc
acc

但是如果字符串中有除了空格之外的其余符号,这种的优先级应该最低,比如

aaa ccc
aaa &bbb
aaa bbb

排序后的结果为

aaa bbb
aaa ccc
aaa &bbb

求算法厉害的大佬给个办法....

阅读 2.6k
3 个回答

这个对字符串的比较规则应该如下:

  1. 如果两个字符串完全想等,则返回0
  2. 否则依次按字符比较
    2.1. 如果两个字符串相同长度部分相同,则那个长更大
    2.2 否则依次比较字符串相同位置的字符,区分普通字符( \da-zA-z)和其他字符来比较,如果一个是普通字符,一个是其它字符,其它字符对应的更大,如果属于同类,则直接比较字符大小。
function compare(a, b) {
        if (a < b) {           
            return -1;
        }
        if (a > b) {
            return 1;
        }
        return 0;
    }
function cmpLocal(a,b){
    if(a==b) return 0;
    let aA=a.split('');
    let bA=b.split('');
    let end = aA.length - bA.length;
    let minL=Math.min(aA.length,bA.length);
    for(let i=0;i<minL;i++){
       if (aA[i]==bA[i]) continue;
       let cRE=/[^ \da-zA-z]/
       let matchAi = aA[i].match(cRE);
       let matchBi = bA[i].match(cRE);
       return (matchAi!=matchBi) ? (matchAi ? 1 : -1) : compare(aA[i], bA[i]);
    }
    return end;
}
arr.sort(cmpLocal) ;

将含有特殊字符的字符串过滤出来

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)
    })
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题