Сортировка массива по количеству цифр в каждом элементе от наибольшего к наименьшему с использованием циклов java - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь отсортировать массив по количеству цифр в каждом элементе от наибольшего к наименьшему. Технически это работает, но, похоже, сортирует массив и по значению. Например, вместо распечатки 1234 700 234 80 52 следует напечатать 1234 234 700 52 80, поскольку 234 перед 700 в исходном массиве.

public class Sort {    
    public static void main(String[] args) {        
        //Initialize array     
        int [] arr = new int [] {52, 234, 80, 700, 1234};     
        int temp = 0;    

        //Displaying elements of original array    
        System.out.println("Elements of original array: ");    
        for (int i = 0; i < arr.length; i++) {     
            System.out.print(arr[i] + " ");    
        }    

        //Sort the array in descending order
        //Math function is used to find length of each element    
        for (int i = 0; i < arr.length; i++) {    
            for (int j = i+1; j < arr.length; j++) {     
               if(Math.log10(arr[i]) + 1 < Math.log10(arr[j]) + 1) {    
                   temp = arr[i];    
                   arr[i] = arr[j];    
                   arr[j] = temp;    
               }     
            }     
        }    

        System.out.println();    

        //Displaying elements of array after sorting    
        System.out.println("Elements of array sorted in descending order: ");    
        for (int i = 0; i < arr.length; i++) {     
            System.out.print(arr[i] + " ");    
        }    
    }    
}

1 Ответ

1 голос
/ 01 апреля 2020

Самый простой способ найти длину числа - это преобразовать его в String и затем вызвать метод length для него.

int number = 123;
String numberAsString = String.valueOf(number);
int length = numberAsString.length(); // returns 3

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

  • делим на 1 (у нас есть хотя бы длина 1)
  • делим на 10> 0 (мы иметь как минимум длину 2)
  • деление на 100> 0 (у нас как минимум длина 3)
  • ...

переменная i используется в качестве дивиденда, а переменная j используется в качестве счетчика. j считает длину числа.

Как только number / i равно нулю, мы возвращаем значение счетчика.

public int lengthOfNumber(int number) {
    if (number == 0) {
        return 1;
    }
    for (int i = 1, j = 0; ; i *= 10, j++) {
        if (number / i == 0) {
            return j;
        }
    }
}

Существует несколько способов сортировки массива. Вот несколько примеров (я использовал строковую версию для сравнения значений).

Использовать вложенные для -l oop

public void sortArray(int[] array) {
    for (int i = 0; i < array.length; i++) {
        int swapIndex = -1;
        int maxLength = String.valueOf(array[i]).length();
        for(int j = i + 1; j < array.length; j++) {
            int length2 = String.valueOf(array[j]).length();
            if (maxLength < length2) {
                maxLength = length2;
                swapIndex = j;
            }
        }

        if (swapIndex > -1) {
            int temp = array[i];
            array[i] = array[swapIndex];
            array[swapIndex] = temp;
        }
    }
}

Я использовал переменную swapIndex, которая инициализируется с помощью -1. Таким образом, мы можем избежать ненужных операций с массивами. Мы берем первый элемент во внешнем for-l oop и go через остальную часть массива во внутреннем for-l oop. мы сохраняем новый swapIndex, только если в остальной части массива есть число с большей длиной. если нет номера с большей длиной, swapIndex остается -1. Мы делаем возможный обмен только во внешнем for-l oop, если необходимо (если установлен swapIndex).

Использование Arrays.sort ()

Если вы хотите использовать Arrays.sort вам нужно преобразовать ваш массив из примитивного типа int в Integer.

public void sortArray(Integer[] array) {
    Arrays.sort(array, (o1, o2) -> {
        Integer length1 = String.valueOf(o1).length();
        Integer length2 = String.valueOf(o2).length();
        return length2.compareTo(length1);
    });
}

Использование рекурсивного метода

public void sortArray(int[] array) {
    for (int i = 0; i < array.length - 1; i++) {
        String current = String.valueOf(array[i]);
        String next = String.valueOf(array[i + 1]);

        if (current.length() < next.length()) {
            int temp = array[i];
            array[i] = array[i + 1];
            array[i + 1] = temp;

            // here you do a recursive call
            sortArray(array);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...