19

我有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"}
4

9 回答 9

23

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

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

希望你喜欢!

于 2013-03-08T08:48:30.413 回答
5

我认为迄今为止将Strings转换为s的最简单和最有效的方法int

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反正 - 使上述方法更加有效。

于 2013-03-08T08:46:22.227 回答
3

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

字母算法

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

Arrays.sort(myarray, new AlphanumComparator());
于 2017-05-24T11:07:02.360 回答
2

如果它只包含字符串格式的数字,你可以使用 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+"  ");
        }
}
于 2013-03-08T09:07:01.817 回答
2

如果您的 String 数组中的所有元素都表示数字,并且数字始终为正数,那么有一种简单的方法可以按数字排序,而不受数字值的限制。

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

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

Arrays.sort(array,
            Comparator.comparing(String::length).thenComparing(Function.identity()));
于 2018-06-01T06:33:37.153 回答
2

在 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(".")))));
于 2019-01-24T08:39:26.950 回答
1

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

Arrays.sort(array, new Comparator<String>() {
    @Override
    public int compare(String str1, String str2) {
        return Integer.parseInt(str1) - Integer.parseInt(str2);
    }
});
于 2013-03-08T08:53:38.057 回答
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]);
        }
    }

}
于 2013-03-08T08:58:11.900 回答
0

这是我能想到的最好的解决方案,当字符串很大时我们无法转换为整数,这种方法对字符串数组进行排序

public static void sortListOfStringsAsNumbers(List<String> unsorted) {        
    String min = "";
    for (int i = 0; i < unsorted.size(); i++){
        min = unsorted.get(i);
        int indexMin = i;
        for (int j = i + 1; j < unsorted.size(); j++){
            if (unsorted.get(j).length() < min.length()){
                min = unsorted.get(j);
                indexMin = j;
            }else if (unsorted.get(j).length() == min.length()){
                for (int x = 0; x < unsorted.get(j).length(); x ++){
                    if (unsorted.get(j).charAt(x) < min.charAt(x)){
                        min = unsorted.get(j);
                        indexMin = j;
                    }else if (unsorted.get(j).charAt(x) > min.charAt(x)){
                        break;
                    }
                }
            }
        }
        if (indexMin != i){
            String temp = unsorted.get(i);
            unsorted.set(i, min);
            unsorted.set(indexMin, temp);
        }
                    
    }

}
于 2021-11-01T21:47:31.263 回答