从java中的第三个字符排序字符串

时间:2015-01-10 15:59:02

标签: java sorting comparator

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

我知道我可以使用冒泡排序,但它有很多工作,并且有一个java Comparator类可用于比较两个对象。我可以根据第一个字符对它进行比较,但我想从第三个字符中对它进行排序。

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

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

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

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

3 个答案:

答案 0 :(得分:2)

返回substring而不是实际的String

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

答案 1 :(得分: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));
}

答案 2 :(得分:1)

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

如果您想要更快的解决方案,自己编写比较器并不困难。

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个字符,这种方法也是安全的。