从 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 个字符,这种方法也是安全的。
如何从第三个字符开始对 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 个字符,这种方法也是安全的。