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