如何从第三个字符中对String
进行排序?
我知道我可以使用冒泡排序,但它有很多工作,并且有一个java Comparator
类可用于比较两个对象。我可以根据第一个字符对它进行比较,但我想从第三个字符中对它进行排序。
这是我比较和排序两个字符串的代码:
public class test implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
}
如何修改它以从第三个字符排序,而不是从第一个字符排序?
编辑:我的代码只在String
长度大于或等于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个字符,这种方法也是安全的。