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



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

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

我使用了一个用-1初始化的变量swapIndex。这样我们就可以避免不必要的数组操作。我们获取外部for循环中的第一个元素,并遍历内部for循环中数组的其余部分。如果在阵列的其余部分中存在具有更高长度的数字,则我们仅保存新的CCD_。如果不存在具有更高长度的数字,则swapIndex保持为-1。如果需要(如果设置了swapIndex(,我们只在外部for循环中进行可能的交换。

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

最新更新