所以我得到了一个简单的arraylist,我想按字母顺序排序,那部分我下来了。没问题,问题是,列表上的名称前面有一个ID号。我需要根据字母表对其进行排序。任何帮助表示赞赏,见下文。
student.add("01, Pentecoast");
student.add("02, Walker");
student.add("03, Smith");
student.add("04, Gonzalez");
student.add("05, Kylekorn");
student.add("06, Queen");
student.add("07, Divan");
student.add("08, Homero");
student.add("09, Flanders");
student.add("10, Simpsons");
我的排序方式是:
Collections.sort(students, String.CASE_INSENSITIVE_ORDER);
但他们的数字正在上升。
答案 0 :(得分:2)
我认为您需要自定义Comparator
,但我们要定义并初始化您的List
。像,
List<String> student = new ArrayList<>();
student.add("01, Pentecoast");
student.add("02, Walker");
student.add("03, Smith");
student.add("04, Gonzalez");
student.add("05, Kylekorn");
student.add("06, Queen");
student.add("07, Divan");
student.add("08, Homero");
student.add("09, Flanders");
student.add("10, Simpsons");
然后处理null
和split
。比较数字后面的文字。像,
Collections.sort(student, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1 == null) {
return o2 == null ? 0 : -1;
} else if (o2 == null) {
return 1;
}
String[] o1Arr = o1.split(", ");
String[] o2Arr = o2.split(", ");
return o1Arr[1].compareTo(o2Arr[1]);
}
});
System.out.println(student);
输出按名称排序(我得到,格式化此帖子)
[07, Divan, 09, Flanders, 04, Gonzalez, 08, Homero,
05, Kylekorn, 01, Pentecoast, 06, Queen, 10, Simpsons,
03, Smith, 02, Walker]
答案 1 :(得分:1)
由于您只想比较没有id值的名称,您可以在自定义比较器中对您想要的学生名称部分进行子串:
Comparator<String> comparator = new Comparator<String>(){
@Override
public int compare(final String sid1, final String sid2){
return sid1.substring(4).compareTo(sid2.substring(4));
}
};
您可以这样排序:
Arrays.sort(students, comparator);
答案 2 :(得分:0)
您应该定义自己的比较器,比较第一个非数字字符并相应地进行排序。
Collections.sort(students, new Comparator<String>() {
@Override
public int compare(String item1, String item2) {
return item1.split(", ")[1].compareTo(item2.split(", ")[1]);
}
});