【发布时间】:2017-09-01 15:56:45
【问题描述】:
所以我尝试使用比较器对字符串数组进行排序,但排序是基于字符串的长度,然后是字符串的第三个字符。
到目前为止,这是我的比较器:
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"}
【问题讨论】:
-
您的问题需要可验证,因此请提供示例输入
-
"但我的数组中的每个字符串的长度至少为 4,所以我不明白为什么会出错。"这是错误的,否则你不会有例外。设置断点并以调试模式或其他方式运行:如果字符串长度超过 4,则添加检查并抛出异常。
-
观察:
compareTo是否被""或s1.charAt(3)+""调用?也许这里有有趣的顺序优先权。 -
请注意,您的代码可以简化为
Comparator<String> c = Comparator.comparingInt(String::length).thenComparingInt(s -> s.charAt(3));。 -
无需全部转换为字符串等。只需使用-new Character(s1.charAt(2)).compareTo(s2.charAt(2))
标签: java arrays string sorting comparator