排序String对象

时间:2012-06-04 19:15:30

标签: java collections sorting

我只是想看看是否有一种简单的方法来对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(值)之后,订单现在被破坏了:

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(...)中使用的词典排序吗?有没有更简单的方法让这种排序按照我想要的方式工作?

提前致谢。

3 个答案:

答案 0 :(得分:9)

  

这是因为Collections.sort(...)中使用的词典排序吗?

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

  

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

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

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

答案 1 :(得分: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()方法和使用数字属性的自然顺序。

答案 2 :(得分:0)

另见this帖子

您需要使用The Alphanum Algorithm

其他人以前建议实施比较器。 here's an implementation

祝你好运!