Java: сортировка массива String, строки которого представляют int

У меня есть массив 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"}

Ответ 1

Я думаю, что самый простой и эффективный способ преобразовать 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

Попробуйте пользовательский Comparator, например:

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

Надеюсь, вам понравится!

Ответ 3

Ваш желаемый результат содержит порядковый номер соответствующих целых чисел. Таким образом, вы не можете избежать преобразования строк в целые числа. В качестве альтернативного компаратора к vikingsteve вы можете использовать это:

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

Ответ 4

U может использовать 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+"  ");
        }
}

Ответ 5

Если все элементы, если ваш массив String представляет числа, и если числа всегда положительны, тогда существует простой способ сортировки численно без ограничения на значение числа.

Это основано на том факте, что число с большим числом цифр в этом случае всегда превышает число с меньшим числом цифр.

Сначала вы сравниваете количество цифр, а затем (только если количество цифр одинаково) вы сравниваете значение в алфавитном порядке:

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

Ответ 6

открытый класс 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]);
    }
}

}

Ответ 7

Я нашел эту статью о сортировке строк с помощью числовой сортировки для строк, которые могут содержать или не содержать числа:

Алфавитный алгоритм

Существует пример реализации Java, связанный с этой статьей. С помощью этого класса вы сможете сортировать массивы численно следующим образом:

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

Ответ 8

в jdk8 этот код можно написать с помощью лямбды.

        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(".")))));