排序Arraylist忽略数字按字母顺序排列

时间:2015-10-19 02:00:36

标签: java sorting arraylist collections

所以我得到了一个简单的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);

但他们的数字正在上升。

3 个答案:

答案 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");

然后处理nullsplit。比较数字后面的文字。像,

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]);
    }
});