Java:对String数组进行排序,其字符串表示int

时间:2013-03-08 08:42:09

标签: java sorting

我有String[]数组,如

{"3","2","4","10","11","6","5","8","9","7"}

我想按数字顺序对其进行排序,而不是按字母顺序排序。

如果我使用

Arrays.sort(myarray);

我获得了

{"10","11","2","3","4","5","6","7","8","9"}

而不是

{"2","3","4","5","6","7","8","9","10","11"}

8 个答案:

答案 0 :(得分:20)

尝试自定义Comparator,如下所示:

    Arrays.sort(myarray, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return Integer.valueOf(o1).compareTo(Integer.valueOf(o2));
        }
    });

希望你喜欢它!

答案 1 :(得分:3)

到目前为止,我认为将String转换为int s的最简单,最有效的方法是:

int[] myIntArray = new int[myarray.length];

for (int i = 0; i < myarray.length; i++) {
    myIntArray[i] = Integer.parseInt(myarray[i]);
}

然后对整数数组进行排序。如果你真的需要,你可以随后转换回来:

for (int i = 0; i < myIntArray.length; i++) {
    myarray[i] = "" + myIntArray[i];
}

另一种方法是使用Comparator界面来确切地说明元素的比较方式,但这可能相当于将每个String值转换为int - 以上方法效率更高。

答案 2 :(得分:1)

您想要的输出包含字符串对应整数的数字顺序。因此,只需就无法避免将字符串转换为整数。作为vikingsteve的替代比较,你可以使用它:

Arrays.sort(array, new Comparator<String>() {
    @Override
    public int compare(String str1, String str2) {
        return Integer.parseInt(str1) - Integer.parseInt(str2);
    }
});

答案 3 :(得分:1)

如果只包含字符串格式的数字,则可以使用sol-1。

解决方案-1: -

String []arr = {"3","2","4","10","11","6","5","8","9","7"};
        Set<Integer> set = new TreeSet<Integer>();
        Arrays.sort(arr);
        for(String s:arr){
            System.out.print(s+"  ");
            set.add(Integer.parseInt(s));
        }
        System.out.println(set);
        Integer i = new Integer("4f");
        System.out.println(i);

解-2: -

String []arr = {"3","2","4","10","11","6","5","8","9","7","jgj","ek"};
        Set<Integer> intSet = new TreeSet<Integer>();
        Set<String> strSet = new TreeSet<String>();
        Arrays.sort(arr);
        for(String s:arr){
            try {
                int i = Integer.parseInt(s);
                intSet.add(i);
            } catch (NumberFormatException e) {
                strSet.add(s);
            }
        }
        List<String> result = new ArrayList<String>();
        for(int val:intSet){
            result.add(val+"");
        }
        result.addAll(strSet);
        System.out.println(result);
    }

解决方案-3: -

编写一个CustomComparator类并将其传递给sort()方法。

public class CustomComparator implements Comparator<String>{

    @Override
    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 i1.compareTo(i2);
        }else{
            return s1.compareTo(s2);
        }
    }

}


public static void main(){
String []arr = {"3","2","4","10","11","6","5","8","9","7","jgj","ek"};
Arrays.sort(arr, new CustomComparator());
        for(String s:arr){
            System.out.print(s+"  ");
        }
}

答案 4 :(得分:1)

如果你的String数组中的所有元素都代表数字,并且数字总是正数,那么有一种简单的数字排序方式,而不限制数字的值。

这是基于这样一个事实,即在这种情况下,具有较大位数的数字总是高于具有较小位数的数字。

首先比较数字位数,然后(仅当数字位数相同时),您按字母顺序比较数值:

Arrays.sort(array,
            Comparator.comparing(String::length).thenComparing(Function.identity()));

答案 5 :(得分:0)

public class test1 {

public static void main(String[] args) 
{
    String[] str = {"3","2","4","10","11","6","5","8","9","7"};
    int[] a = new int[str.length];
    for(int i=0;i<a.length;i++)
    {
        a[i]=Integer.parseInt(str[i]);
    }
    Arrays.sort(a);
    for(int i=0;i<a.length;i++)
    {
        str[i]=String.valueOf(a[i]);
    }
}

}

答案 6 :(得分:0)

我发现这篇文章关于通过数字排序对字符串进行排序也适用于可能包含或不包含数字的字符串:

The Alphanum Algorithm

本文链接了一个Java实现示例。 使用该类,您应该能够以数字方式对数组进行排序:

Arrays.sort(myarray, new AlphanumComparator());

答案 7 :(得分:0)

在jdk8中,您可以使用lambda编写此代码。

        List<String> list = Arrays.asList("3", "2", "4", "10", "11", "6", "5", "8", "9", "7");
        list.sort(Comparator.comparingInt(Integer::valueOf));
        list.forEach(System.out::println);

尤其是输入

String[]{"3.b", "2.c", "4.d", "10.u", "11.a", "6.p", "5.i", "8.t", "9.e", "7.i"}

您可以使用string.subString选择您真正要排序的值。

 files.sort(Comparator.comparingInt(a -> Integer.valueOf(a.substring(0, a.indexOf(".")))));