Sorting an array by number of digits in each element from largest to smallest using loops java

javabeginner :

I'm trying to sort an array by the number of digits in each element from largest to smallest. This technically works but it seems to sort the array by value as well. For example, instead of printing out 1234 700 234 80 52, it should print 1234 234 700 52 80 as 234 is before 700 in the original array.

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] + " ");    
        }    
    }    
}
name not found :

The easiest way to find the length of the number is to convert it into a String and then call the method length on it.

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

But you also could do it by division. The following method takes a number and divides by multiples of 10.

  • divide by 1 (we have at least a length of 1)
  • division by 10 > 0 (we have at least a length of 2)
  • division by 100 > 0 (we have at least a length of 3)
  • ...

the variable i is used as dividend and the variable j is used as counter. j counts the length of the number.

As soon as number / i equals zero we return the counter value.

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;
        }
    }
}

There are multiple ways to sort the array. Here are some examples (I used the string version for comparing the values).

Use nested for-loop

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;
        }
    }
}

I used a variable swapIndex which is initialized with -1. This way we can avoid unnecessary array operations. We take the first element in the outer for-loop and go through the rest of the array in the inner for-loop. we only save a new swapIndex if there is a number in the rest of the array with a higher length. if there is no number with a higher length, swapIndex remains -1. We do a possible swap only in the outer for-loop if necessary (if swapIndex was set).

Using Arrays.sort()

If you want to use Arrays.sort you need to convert your array from primitive type int to 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);
    });
}

Using a recursive method

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);
        }
    }
}

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=384995&siteId=1