我想对包含许多行的arraylist进行排序
我想忽略' - '
如果是该行的第一个字母
INPUT
-bbb
一个-AAA
滴滴滴
B-DDD
C-CCC
输出
应该是(你可以看到它应该按照第一个字符排序(a b c d)
一个-AAA
-bbb
C-CCC
滴滴滴
E-EEE
这是我的代码
Collections.sort(arrList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.startsWith("-") && o2.startsWith("-")) {
return compare(o1.substring(1), o2.substring(1));
}
if (o1.startsWith("-")) {
return 1;
}
if (o2.startsWith("-")) {
return -1;
}
return o1.compareTo(o2);
}
});
答案 0 :(得分:3)
您在比较器中使用 |
而不是-
。
您的比较不正确,如果o2
以o1
开头,则您无法忽略-
:
if (o1.startsWith("-")) {
return 1;
}
这会忽略很多结果......
要正确比较,您必须遵循此行为:如果String
以-
开头,则获取第二个字符(位置1),否则取第一个字符(位置0) 。只要您不能compareTo
原始类型,单个字符的substring
将更有用。
分别对每个字符串执行此操作,并compareTo
结果。
知道这一点你可以实现你的比较器(还有其他简化和oneliners答案,但为了OP可以更好地理解我将是基本的):
Collections.sort(arrList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String s1 = "", s2 = "";
// check first string and choose
//candidate character to compare
if (o1.startsWith("-"))
s1 = o1.substring(1);
else
s1 = o1.substring(0);
// check second string and choose
// candidate character to compare
if (o2.startsWith("-"))
s2 = o2.substring(1);
else
s2 = o2.substring(0);
// compare both choosen characters
return s1.compareTo(s2);
}
});
主要用于测试:
List<String> list = new ArrayList<>();
list.add("-bbb");
list.add("a-aaa");
list.add("-ddd");
list.add("b-ddd");
list.add("c-ccc");
<强>输出:强>
a-aaa
b-ddd
-bbb
c-ccc
-ddd
答案 1 :(得分:1)
老实说,没有必要做那么多工作。只需在使用正则表达式时比较两个值。你最初遇到的问题是,当你从-
开始时,你从来没有忽略它们,如果它以-
public static void main(String[] args) {
List<String> testList = new ArrayList<>();
testList.add("-bbb");
testList.add("a-aaa");
testList.add("-ddd");
testList.add("b-ddd");
testList.add("c-ccc");
Collections.sort(testList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// This removes leading - from the input and ignores them
// At the moment it removes one ore more -, if it should just be one
// remove the +
return o1.replaceAll("^-+", "").compareTo(o2.replaceAll("^-+", ""));
}
});
for(String s : testList) {
System.out.println(s);
}
}
O / P
a-aaa
b-ddd
-bbb
c-ccc
-ddd
答案 2 :(得分:0)
double
或更短但不太可读
final String o1s;
final String o2s;
if (o1.startsWith("|")) {
o1s = o1.substring(1);
} else {
o1s = o1;
}
if (o2.startsWith("|")) {
o2s = o2.substring(1);
} else {
o2s = o2;
}
return o1s.compareTo(o2s);
答案 3 :(得分:0)
以下是您的要求的逻辑
public int compare(String str1, String str2) {
if(str1.startsWith("-")){
if(str2.startsWith("-")){
str1 = str1.substring(1);
str2 = str2.substring(1);
return str1.compareTo(str2);
}else{
str1 = str1.substring(1);
return str1.compareTo(str2);
}
} else if(str2.startsWith("-")){
if(str1.startsWith("-")){
str1 = str1.substring(1);
str2 = str2.substring(1);
return str1.compareTo(str2);
}else{
str2 = str2.substring(1);
return str1.compareTo(str2);
}
}else{
return str1.compareTo(str2);
}
}