使用循环java按照每个元素的位数从大到小对数组排序

4zcjmb1e  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(139)

我试着按每个元素的位数从大到小排序数组,这在技术上是可行的,但它似乎也按值排序数组,例如,它应该打印1234 234 700 52,而不是打印1234 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] + " ");    
        }    
    }    
}
hrysbysz

hrysbysz1#

找到数字长度的最简单方法是将其转换为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;
        }
    }
}

有多种方法可以对数组进行排序。下面是一些示例(我使用字符串版本来比较值)。

使用嵌套的for循环

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循环中的第一个元素,并在内层for循环中遍历数组的其余部分。只有当数组的其余部分中有一个长度更大的数字时,我们才保存一个新的swapIndex。如果没有长度更大的数字,swapIndex仍然是-1。如果需要,我们只在外部for循环中进行可能的交换(如果swapIndex已设置)。

使用数组.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);
        }
    }
}

相关问题