对包含数字和字母的Arraylist进行排序

时间:2016-01-28 13:19:25

标签: java sorting arraylist

这是我现在的arraylist:

ArrayList<String> myArrayList = new ArrayList<String>();    

[102423;asd.com, 49952;qwe.com, 76933;rty.com, 199526;fgh.com, 139388;jkl, 25114;qaz, 155766;ghj.com, 321339;vbn.com, 210513;kol.com]

我想用数字对它们进行排序。我试过以下:

Collections.sort(myArrayList)
for(String counter : myArrayList){
   System.out.println(counter);
  }

但它不起作用。我想分裂然后做Collections.sort然后我不知道我将如何配对他们再次。

3 个答案:

答案 0 :(得分:4)

使用Collections.sort(List<T> list, Comparator<? super T> c)静态方法并提供自定义Comparator,其compare()方法从两个元素中提取数字前缀,并仅比较这些前缀。

例如,您可以使用String.split(";")来获取数字前缀。

答案 1 :(得分:2)

使用如下比较器:

public class CustomComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        return o1.split(";")[0].compareTo(o2.split(";")[0]);
    }
}

您的排序代码就像您写的那样:

Collections.sort(arrayList, new CustomComparator());

答案 2 :(得分:0)

它无效的原因是您已声明ArrayList String。因此,Collections.sort(YourArrayList)会将其排序为lexicographicall。因此,您必须编写自己的Comparator来读取字符串并对其进行解释并进行比较。

所以,试试这个。

    List<String> list = Arrays.asList(
        "102423;asd.com", "49952;qwe.com", "76933;rty.com",
        "199526;fgh.com", "139388;jkl", "25114;qaz",
        "155766;ghj.com", "321339;vbn.com", "210513;kol.com");
    List<String> sorted = list.stream()
        .sorted(Comparator.comparing(s -> String.format("%0" + (20 - s.indexOf(';')) + "d%s", 0, s)))
        .collect(Collectors.toList());
    for (String s : sorted)
        System.out.println(s);

结果是

25114;qaz
49952;qwe.com
76933;rty.com
102423;asd.com
139388;jkl
155766;ghj.com
199526;fgh.com
210513;kol.com
321339;vbn.com

此内部代码排序列表

00000000000000102423;asd.com
00000000000000049952;qwe.com
00000000000000076933;rty.com
00000000000000199526;fgh.com
00000000000000139388;jkl
00000000000000025114;qaz
00000000000000155766;ghj.com
00000000000000321339;vbn.com
00000000000000210513;kol.com