如何排序包含整数的字符串列表

时间:2014-05-05 07:50:26

标签: java string sorting integer

我想对包含数字的String列表进行排序。

例如,我有一个包含元素"1,2,3,4,5,11,12,21,22,31,32,A101,A102,A103,A104,B405"的列表。

如果我使用Collection.sort方法,则表示输出为"1,11,12,2,21,22,3,31,32... "

如果我使用比较器功能意味着它给出  输出为"1,2,3,4,5,11,12,21,22,31,32,A101... ".

但我需要显示为

"A101,A102,A103,A104,B405,1,2,3,4,5,11,12,21,22,31,32"

请任何人给我一个解决方案。提前谢谢。

3 个答案:

答案 0 :(得分:2)

实现自己的比较器,尝试将要比较的对象转换为整数,如果成功,则使用Integer类的compareTo,否则使用String类的compareTo。

像这样:

public class MyComparator implements Comparator<String,String>
{
    public int compare(String s1, String s2)
   {
       try
       {
           int i1 = Integer.parseInt(s1);
           int i2 = Integer.parseInt(s2);
           return i1 - i2;
       }
       catch (NumberFormatException e)
       {
           return s1.compareTo(s2);
       }
   }
}

ArrayList<String> myList = (...);
Collections.sort(myList,new MyComparator());

如评论所述,这类似1,12,A102,A103。但想要的是:A102,A103,1,12。为此,我们需要处理s1可解析为int且s2不可解决的情况,反之亦然。我不确定我是否正确-11,所以也许他们应该互换。

public class MyComparator implements Comparator<String,String>
{
    public int compare(String s1, String s2)
   {
       Integer i1 = null
       Integer i2 = null
       try
       {
           i1 = Integer.parseInt(s1);
       }
       catch (NumberFormatException e) {}
       try
       {
           i2 = Integer.parseInt(s2);
       }
       catch (NumberFormatException e) {}
       if (i1 == null && i2 == null)
           return s1.compareTo(s2);
       if (i1 == null && i2 != null)
           return -1;
       if (i1 != null && i2 == null)
           return 1;
       return i1 - i2;
   }
}

答案 1 :(得分:0)

创建一个新的&#34;持有者&#34;字符串的对象并实现Comparable接口。覆盖&#34; compareTo&#34;方法。这应该可以解决问题;)

答案 2 :(得分:0)

答案存在于您的问题中,只需创建两个列表并单独排序!

package com.kvvssut.misc;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;


public class SortStringThenNumber {

    public static void main(String[] args) {
        List<String> inputs = Arrays.asList(new String[]{"1","5","3","4","2","11","11","21","31","32","22","A101","A103","A104","B405","A102"});
        List<Object> result = sortStringThenNumber(inputs);

        for (Object sorted : result) {
            System.out.println(String.valueOf(sorted));
        }
    }

    private static List<Object> sortStringThenNumber(List<String> inputs) {

        List<Integer> numbers = new ArrayList<Integer>();
        List<String> strings = new ArrayList<String>();

        for (String input : inputs) {
            if (input.matches("-?\\d+")) {
                numbers.add(Integer.valueOf(input));
            } else {
                strings.add(input);
            }
        }
        inputs = null;

        Collections.sort(numbers);
        Collections.sort(strings);

        ArrayList<Object> all = new ArrayList<Object>();
        all.addAll(strings);
        all.addAll(numbers);

        return all;
    }

}