2012-06-04 129 views
1

我只是想看看是否有一个简单的方法来排序字符串对象列表。我现在面临的问题是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(...)中使用的词典排序?有没有一种更简单的方法可以按照我想要的方式进行这种排序?

在此先感谢。

+0

可能的重复[自然排序顺序字符串比较在Java中 - 是内置?](http://stackoverflow.com/questions/1262239/natural-sort-order-string-comparison-in-java-is-一个内置的) –

回答

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()方法以及使用number属性的自然排序。

9

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

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

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

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

当然,如果你可以改变你的数据section_01section_02等,这将意味着你可以只使用天然排序顺序...

+0

@NominSim:我刚刚添加了同样的东西:) –

+0

是的,刚刚看到并删除了我的评论哈哈。 – NominSim