从 java 中的第三个字符开始对字符串进行排序

sort string from the third character in java

如何从第三个字符开始对 String 进行排序?

我知道我可以使用冒泡排序,但工作量很大,而且有一个 java Comparator class 可以用来比较两个对象。我可以根据第一个字符比较,但我想从第三个字符开始排序。

这是我比较和排序两个字符串的代码:

public class test implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
}

如何修改它以从第三个字符开始排序,而不是从第一个字符开始排序?

编辑: 我的代码仅在 String 长度大于或等于 3 时执行比较器部分,因此字符串大小不可能小于3 个字符。

return substring 而不是实际的 String,

@Override
public int compare(String s1, String s2) {
     return s1.substring(2).compareTo(s2.substring(2));
}

您可以在比较器中使用 String.substring,这样您就可以这样写:

public int compare(String s1, String s2) {
    if (s1.length() > 2 && s2.length() > 2) {
        return s1.substring(2).compareTo(s2.substring(2));
    } else if (s1.length() > 2) {
        return 1;
    } else if (s2.length() > 2) {
        return -1;
    } else {
        // What you are supposed to do
    }
}

编辑:

因为你确定给这个方法的字符串,都是大于等于3个字符,所以你可以只写必要的部分:

public int compare(String s1, String s2) {
    return s1.substring(2).compareTo(s2.substring(2));
}

之前已经提到过基于substring()的方法。但是,对于任何两次比较,它都会 将您的字符串复制 到一个新数组中 - 这非常昂贵(它在 Java 中变得更加昂贵 7 - 在 Java 6, substring 会避免复制数据).

如果你想要一个更快的解决方案,自己写一个比较器并不难。

public class SubstringComparator implements Comparator<String> {
    int first = 2;
    @Override
    public int compare(String s1, String s2) {
        final int l = Math.min(s1.length(), s2.length());
        for (int i = first; i < l; i++) {
            int c = Integer.compare(s1.charAt(i), s2.charAt(i));
            if (c != 0) return c;
        }
        return Integer.compare(s1.length(), s2.length());
    }
}

如果字符串少于 3 个字符,这种方法也是安全的。