javabeginner:
私は、最大から最小までの各要素の桁数によって配列をソートしようとしています。これは技術的に動作しますが、同様値で配列をソートするようです。たとえば、代わりに1234 700 234 80 52をプリントアウト、それは234として1234 234 700 52 80を印刷する必要があり、元の配列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] + " ");
}
}
}
名前が見つかりません。
数の長さを見つけるための最も簡単な方法は、Aに変換することで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
セットがありました)。
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);
}
}
}