使用基于字符串中字符的比较器对字符串数组进行排序
Sorting a String Array using a Comparator based on a Character in the String
所以我尝试使用比较器对字符串数组进行排序,但排序是基于字符串的长度,然后是字符串的第三个字符。
到目前为止,这是我的比较器:
class StringSorter implements Comparator<String> {
public int compare(String s1, String s2) {
if(s1.length() < s2.length()) {
return -1;
}
if(s1.length() > s2.length()) {
return 1;
}
return s1.charAt(3)+"".compareTo(s2.charAt(3)+"");
}
}//Comparator
这一行 return s1.charAt(3)+"".compareTo(s2.charAt(3)+"");
是我到目前为止的尝试,我得到了一个 IndexOutOfBoundsException 但我数组中的每个字符串的长度至少为 4,所以我不明白为什么会出现错误。
至于我的问题,为什么会出现该错误?如果我要根据长度和字符串中的字符进行排序,我应该如何编写比较器?
编辑:我需要处理的数组遵循这种格式
{"1:bbbbb", "2:aaa", "=:ccc", "1:qqqq", "1:eeee", "=:zzz", "1:vvv", "2:oooo", "=:eee", "1:fffff"}
您的代码运行良好。我在这里对其进行了一些调整,以向您展示如何使其更具弹性。
class StringSorter implements Comparator<String> {
private final int pos;
public StringSorter(int pos) {
this.pos = pos;
}
public int compare(String s1, String s2) {
if (s1.length() < s2.length()) {
return -1;
}
if (s1.length() > s2.length()) {
return 1;
}
if ( s1.length() <= pos ) {
return s1.compareTo(s2);
}
return Character.compare(s1.charAt(pos),s2.charAt(pos));
}
}
public void test() {
String[] test2 = {"1:bbbbb", "2:aaa", "=:ccc", "1:qqqq", "1:eeee", "=:zzz", "1:vvv", "2:oooo", "=:eee", "1:fffff"};
System.out.println("Before: " + Arrays.toString(test2));
Arrays.sort(test2, new StringSorter (2));
System.out.println("After: " + Arrays.toString(test2));
}
打印:
Before: [1:bbbbb, 2:aaa, =:ccc, 1:qqqq, 1:eeee, =:zzz, 1:vvv, 2:oooo, =:eee, 1:fffff]
After: [2:aaa, =:ccc, =:eee, 1:vvv, =:zzz, 1:eeee, 2:oooo, 1:qqqq, 1:bbbbb, 1:fffff]
我怀疑您使用的 3
表示第 3 个字符 - 这是错误的。 3rd
字符位于 2
;
位置
记住 - 字符串中的第 n 个字符由 [n-1] 索引,因为第一个字符位于 0
.
这是使用三元运算符解决您的问题的解决方案。
简单的一种线性比较方法。
class StringSorter implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length() != 0 ? s1.length() - s2.length() : new Character(s1.charAt(2)).compareTo(s2.charAt(2));
}
}
所以我尝试使用比较器对字符串数组进行排序,但排序是基于字符串的长度,然后是字符串的第三个字符。
到目前为止,这是我的比较器:
class StringSorter implements Comparator<String> {
public int compare(String s1, String s2) {
if(s1.length() < s2.length()) {
return -1;
}
if(s1.length() > s2.length()) {
return 1;
}
return s1.charAt(3)+"".compareTo(s2.charAt(3)+"");
}
}//Comparator
这一行 return s1.charAt(3)+"".compareTo(s2.charAt(3)+"");
是我到目前为止的尝试,我得到了一个 IndexOutOfBoundsException 但我数组中的每个字符串的长度至少为 4,所以我不明白为什么会出现错误。
至于我的问题,为什么会出现该错误?如果我要根据长度和字符串中的字符进行排序,我应该如何编写比较器?
编辑:我需要处理的数组遵循这种格式
{"1:bbbbb", "2:aaa", "=:ccc", "1:qqqq", "1:eeee", "=:zzz", "1:vvv", "2:oooo", "=:eee", "1:fffff"}
您的代码运行良好。我在这里对其进行了一些调整,以向您展示如何使其更具弹性。
class StringSorter implements Comparator<String> {
private final int pos;
public StringSorter(int pos) {
this.pos = pos;
}
public int compare(String s1, String s2) {
if (s1.length() < s2.length()) {
return -1;
}
if (s1.length() > s2.length()) {
return 1;
}
if ( s1.length() <= pos ) {
return s1.compareTo(s2);
}
return Character.compare(s1.charAt(pos),s2.charAt(pos));
}
}
public void test() {
String[] test2 = {"1:bbbbb", "2:aaa", "=:ccc", "1:qqqq", "1:eeee", "=:zzz", "1:vvv", "2:oooo", "=:eee", "1:fffff"};
System.out.println("Before: " + Arrays.toString(test2));
Arrays.sort(test2, new StringSorter (2));
System.out.println("After: " + Arrays.toString(test2));
}
打印:
Before: [1:bbbbb, 2:aaa, =:ccc, 1:qqqq, 1:eeee, =:zzz, 1:vvv, 2:oooo, =:eee, 1:fffff]
After: [2:aaa, =:ccc, =:eee, 1:vvv, =:zzz, 1:eeee, 2:oooo, 1:qqqq, 1:bbbbb, 1:fffff]
我怀疑您使用的 3
表示第 3 个字符 - 这是错误的。 3rd
字符位于 2
;
记住 - 字符串中的第 n 个字符由 [n-1] 索引,因为第一个字符位于 0
.
这是使用三元运算符解决您的问题的解决方案。
简单的一种线性比较方法。
class StringSorter implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length() != 0 ? s1.length() - s2.length() : new Character(s1.charAt(2)).compareTo(s2.charAt(2));
}
}