我只是想看看是否有一种简单的方法来对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(...)中使用的词典排序吗?有没有更简单的方法让这种排序按照我想要的方式工作?
提前致谢。
答案 0 :(得分:9)
这是因为Collections.sort(...)中使用的词典排序吗?
绝对。您已根据自然顺序对字符串进行了排序。
有没有更简单的方法让这种排序按我想要的方式工作?
创建一个实现Comparator<String>
的类,表示您要使用的比较,并将其作为第二个参数传递给Collections.sort
。您必须自己编写逻辑(或者找到第三方库)。我认为标准库中没有任何东西可以做到这一点。 (你需要考虑区分大小写以及可能还有其他各种事情。)
当然,如果您可以将数据更改为section_01
,section_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)