1

我只是想看看是否有一种简单的方法可以对 String 对象列表进行排序。我现在面临的问题是 Collections.sort(...) 方法对我不起作用。

这是我的原始列表,出于我的要求,已对其进行了排序:

    List<String> values = new ArrayList<String>();


    values.add("section_1");
    values.add("section_2");
    values.add("section_3");
    values.add("section_4");
    values.add("section_5");
    values.add("section_6");
    values.add("section_7");
    values.add("section_8");
    values.add("section_9");
    values.add("section_10");
    values.add("section_11");
    values.add("section_12");
    values.add("section_13");

在执行 Collections.sort(values) 之后,顺序现在被破坏了:

section_1
section_10
section_11 
section_12
section_13
section_2
section_3
section_4
section_5
section_6
section_7
section_8
section_9

这种行为是因为 Collections.sort(...) 中使用的字典顺序吗?有没有更简单的方法可以让这种工作按我想要的方式工作?

提前致谢。

4

3 回答 3

9

这种行为是因为 Collections.sort(...) 中使用的字典顺序吗?

绝对地。您已根据自然顺序对字符串进行了排序。

有没有更简单的方法可以让这种工作按我想要的方式工作?

创建一个类实现Comparator<String>来表达您要使用的比较,并将其作为第二个参数传递给Collections.sort. 您必须自己编写逻辑(或找到第三方库来这样做)。我认为标准库中没有任何东西可以做到这一点。(您需要考虑区分大小写以及可能的各种其他事情。)

当然,如果您可以将数据更改为section_01section_02,这意味着您可以只使用自然排序顺序......

于 2012-06-04T19:17:55.867 回答
1

您需要使用自定义比较器来提取字符串的数字部分,将它们转换为整数实例,然后比较这些整数:

public class SectionComparator implements Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        Integer i1 = Integer.valueOf(s1.substring(s1.indexOf('_') + 1));
        Integer i2 = Integer.valueOf(s1.substring(s2.indexOf('_') + 1));
        return i1.compareTo(i2),
    }
}

但是除了使用字符串来表示部分,您还可以使用Section对象,它具有数字属性、toString()方法和使用数字属性的自然排序。

于 2012-06-04T19:19:30.857 回答
0

另见这篇文章

你需要使用Alphanum 算法

其他人之前建议实施 Comparator。这是一个实现

祝你好运!

于 2012-06-04T19:24:14.210 回答