Sort on a string that may contain a number

前端 未结 23 2310
走了就别回头了
走了就别回头了 2020-11-22 02:59

I need to write a Java Comparator class that compares Strings, however with one twist. If the two strings it is comparing are the same at the beginning and end of the strin

23条回答
  •  孤城傲影
    2020-11-22 03:46

    I came up with a quite simple implementation in Java using regular expressions:

    public static Comparator naturalOrdering() {
        final Pattern compile = Pattern.compile("(\\d+)|(\\D+)");
        return (s1, s2) -> {
            final Matcher matcher1 = compile.matcher(s1);
            final Matcher matcher2 = compile.matcher(s2);
            while (true) {
                final boolean found1 = matcher1.find();
                final boolean found2 = matcher2.find();
                if (!found1 || !found2) {
                    return Boolean.compare(found1, found2);
                } else if (!matcher1.group().equals(matcher2.group())) {
                    if (matcher1.group(1) == null || matcher2.group(1) == null) {
                        return matcher1.group().compareTo(matcher2.group());
                    } else {
                        return Integer.valueOf(matcher1.group(1)).compareTo(Integer.valueOf(matcher2.group(1)));
                    }
                }
            }
        };
    }
    

    Here is how it works:

    final List strings = Arrays.asList("x15", "xa", "y16", "x2a", "y11", "z", "z5", "x2b", "z");
    strings.sort(naturalOrdering());
    System.out.println(strings);
    

    [x2a, x2b, x15, xa, y11, y16, z, z, z5]

提交回复
热议问题