CodeGym /Java Blog /ランダム /Java で配列を反転する
John Squirrels
レベル 41
San Francisco

Java で配列を反転する

ランダム グループに公開済み
配列はコーディングで頻繁に使用され、同じ型の複数の値を 1 つの変数に格納する方法です。プログラマーが配列を反転したい理由は数多くあると考えられます。たとえば、問題のロジックを最後の要素から開始する必要がある場合、配列を反転する必要がある場合があります。この場合、ベスト プラクティスは、反転を実行してから、コード内の必要な箇所で反転した配列を使用することです。さらに、配列を逆にすることは、Java ジュニアの面接で非常に人気のあるタスクです。

配列を反転する方法

配列を反転するには多くの方法がありますが、ここでは 5 を考えます。オプション 1 では、元の配列の末尾 (降順) から昇順で埋められた追加の配列を使用して配列が反転されます。オプション 2 では、その場で反転されます。先頭と末尾の配列要素が交換される場合に実行されます。オプション 3 では、コレクション フレームワークのreverse()メソッドを使用して反転が行われます。オプション 4 では、 List.add()およびList.remove() が行われます。が使用され、最後にオプション 5 で再帰が使用されます。Java で配列を反転する - 1

オプション 1: 追加の配列を使用して配列を反転する

追加の配列を使用して配列を反転する簡単なメソッドを書いてみましょう。このオプションは、元の配列の最後の要素から降順で埋められる追加の配列を使用します。つまり、最初の要素は元の配列の最後の要素と同じであり、2 番目の要素は最後から 2 番目の要素と同じです。追加の配列がいっぱいになるまでオンになります。

import java.util.Arrays;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       int[] array = {7, 8, 9, 10, 11};
       System.out.println("Array : " + Arrays.toString(array)); // print array

       // Call function to get reversed array
       int[] reversedArray = reverse(array);
       System.out.println("Reversed array : " + Arrays.toString(reversedArray)); // print reversed array
   }

   // Method returns a new reversed array, based on the array which was passed to it.
   static int[] reverse(int[] array) {
       int[] newArray = new int[array.length];

       for (int i = 0; i < array.length; i++) {
           newArray[array.length - 1 - i] = array[i];
       }

       return newArray;
   }
}
この例では、配列を反転し、渡された配列に基づいて新しい反転配列を返すメソッドを作成しました。配列がmainで宣言され、メソッドreverseが呼び出されます。メソッドの引数は配列です。reverseメソッドでは、新しい配列newArrayが作成されます。この配列はarrayと同じサイズですが、完全に空です。forループnewArrayを埋めるために使用され、配列の全長にわたって動作します。これは、配列の最初の要素から開始して、それをnewArrayの最後の要素に割り当てることによって行われます。次に、配列の 2 番目の要素を取得し、それをnewArrayの最後から 2 番目の要素に割り当てます。newArray は逆方向に埋められます。for ループが完了すると、newArrayは完全にいっぱいになり、 arrayのまったく逆になります。
配列 : [7, 8, 9, 10, 11] 反転配列 : [11, 10, 9, 8, 7]

オプション 2: 配列の要素を逆の順序で出力する

このオプションで配列を反転するには、追加の配列を使用する必要はなく、配列リストに変換されません。代わりに、配列要素はその場で逆の順序に配置されます。これは、実際には交換されていることを意味します。最初の要素は最後の要素と交換され、2 番目の要素は最後から 2 番目の要素と交換されます。forループが使用され、これが完了すると配列が反転されます。コードは次のようになります。

import java.util.Arrays;
/*
reversing an array in-place
*/
public class ReverseArrayDemo {

   public static void main(String[] args) {
       int[] array = {1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       arrayReverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }
//arrayReverse is a method that reverses array in-place
   static void arrayReverse(int[] array) {
       for (int i = 0; i < array.length / 2; i++) {
           int temp = array[i];
           array[i] = array[array.length - i - 1];
           array[array.length - i - 1] = temp;
       }
   }
}
元の配列はArrays.toString(array)を使用してString として出力され、配列は引数としてreverseに渡されます。forループの逆のメソッドでは、変数 temp が作成され、使用されます。forループでは、次の 3 つの手順で逆の順序が実現されます。
  1. 最初の要素をtempに代入する
  2. 最後の要素を最初の要素に代入する
  3. 最後の要素にtempを割り当てる
これは、今度は 2 番目の要素と最後から 2 番目の要素に対して再度実行され、以下同様に実行されます。これは配列の連続する要素に対して行われますが、ループは配列サイズの半分までしか繰り返しません。基本的に、配列の両端の要素が交換されます。このメソッドは、0 から size までのforループを使用するメソッドの 2 倍の速度で実行されます。その結果、配列の逆順が達成され、配列を逆順で出力し、値を出力する方法が示されています。
反転前の配列 : [1, 4, 9, 16, 25] 反転後の配列 : [25, 16, 9, 4, 1]

オプション 3: Collections.reverse() を使用する

Java では、既存の Collections フレームワークの一部であるreverseメソッドを使用して配列を反転できます。それを使って逆転してみましょう。

import java.util.Arrays;
import java.util.Collections;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = {1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       reverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }
//method that reverses an array
   static void reverse(Integer[] array) {
       Collections.reverse(Arrays.asList(array));
   }
}
main では、配列が作成され、5 つの数値を含む整数配列として埋められます。次に、 Arrays.asList(array)を使用してリストとして出力され、関数reverseが呼び出され、配列が引数としてこの関数に渡されます。reverseでは、Collections.reverseが使用されます。これは、配列自体ではなく、配列リストArrays.asList(array)で使用されます。次のステップでは、 System.out.println を使用して配列を逆順に出力する方法を示します。今回は各要素が同じ行に出力されます。
反転前の配列 : [1, 4, 9, 16, 25] 反転後の配列 : [25, 16, 9, 4, 1]

オプション 4: List.add() と List.remove() を使用して配列を反転する

この新しいオプションでは、List.add()List.remove()を使用して逆転を行います。これがどのように機能するかというと、配列がリストに変換され、リストの最後の要素が削除されてリストの先頭に置かれます。リスト全体が反復処理されると、新しいリストは元のリストを反転したものになります。main()メソッドでは、5 つの数値からなる配列が作成されます。その後、配列の元の状態がコンソールに出力されます。この配列は、メソッドreverse()への引数として置かれます。このメソッドは基本的に、最後の要素を削除して配列の先頭に挿入することで機能します。最後に、配列の新しい (反転された) 状態がコンソールに出力されます。逆に()メソッドを使用すると、 add()メソッドとRemove()メソッドが反転を実行できるようにするために、Arrays.asList(array)を介して配列が List に書き込まれます。このメソッドは基本的に、最後の要素を削除して配列の先頭に挿入することで機能します。reverse()が使用する手順は次のとおりです。forループを使用して、リストの要素の反転を実行します。これは、変数iを初期化することによって行われます。最初にi は0 に設定されます。i = 0の場合、リスト内のlist.size() - 1の要素が削除され、 i < list.size() - 1であるため、これが常に最後の要素になります。Remove()メソッドは削除した要素を返すため、この要素はリストのインデックスi = 0に追加されます。つまり、先頭に挿入されます。リストの残りの部分は右にシフトされますが、新しいリストには依然として同じ数の要素 (つまりsize )が含まれます。iの次の値i = 1でforループの実行を続けると、同じ一連のステップが実行され、最後の要素が削除されてi = 1の nums に入れられ、リストが右にシフトされます。これは、 iの最後の増分値とリスト内のすべての要素が変更されるまで続きます。2番目ではインデックス i を持つリストのループ要素は、インデックスiを持つ配列要素に設定されます。ここで、iは 0 からlist.size() - 1までです。要約すると、使用する手順は 次のとおりです。
  1. i = 0
  2. list.size() - 1の要素を削除します
  3. list.size() - 1にある要素をi = 0 に挿入します
  4. インクリメントi
  5. i の最後の増分値が使用されるまで、ステップ 2 ~ 4 (ステップ 3 で i の新しい値を使用) を繰り返します。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = new Integer[]{1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       reverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }

   static void reverse(Integer[] array) {
       List list = new ArrayList<>(Arrays.asList(array));

       for (int i = 0; i < list.size() - 1; i++) {
           list.add(i, list.remove(list.size() - 1));
       }

       for (int i = 0; i < list.size(); i++) {
           array[i] = list.get(i);
       }
   }
}
このコードの出力は次のとおりです。
反転前の配列 : [1, 4, 9, 16, 25] 反転後の配列 : [25, 16, 9, 4, 1]

オプション 5: 再帰によって配列を反転する

再帰の方法はコーディングで広く使用されており、配列を反転する効率的な方法を作成するために使用できます。このオプションでは、配列がリストに変換され、リストの最後にある最後の要素が削除されるたびにコードがメソッドreverse()に入り、リストには削除された値が逆の順序で追加されます。前のメソッドと同様に、5 つの数値で構成される配列が作成されます。次に、引数として関数reverse()に渡されます。reverse()では、最初に配列をリストに変換し、リストのサイズをチェックします。要素が 1 つしかない場合、または null の場合、メソッドは終了して戻ります。そうでない場合、最初の要素は削除されますが、整数にコピーされます。その後、メソッドreverse()が再度呼び出され、再帰が再び始まります。関数が入力されると、同じステップが実行され、サイズチェックが行われます。リストが 1 より大きい場合、次のステップでは最初の要素が削除され、再帰が再度実行されます。リストのサイズが1 の場合、reverse() は呼び出し元に戻り、リストに各値が追加されて、元のリストのまったく逆のリストが構築されます。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = new Integer[]{1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       List list = new ArrayList<>(Arrays.asList(array));
       reverse(list);
       System.out.println("Array after reverse : " + Arrays.toString(list.toArray()));
   }

   public static void reverse(List list) {
       if (list== null || list.size() <= 1) {
           return;
       }

       Integer value = list.remove(0);

       reverse(list);

       list.add(value);
   }
}
出力は次のとおりです。
反転前の配列 : [1, 4, 9, 16, 25] 反転後の配列 : [25, 16, 9, 4, 1]

結論

そこで、ここでは配列を反転する 5 つの異なる方法を見ていきました。Collections フレームワークを使用するオプション 3 は、 Collections.reverse がすでに存在し、実証済みの Java 関数であるため、おそらく使用するのに最適な方法です。もちろん、特に学習中に他のオプションを使用することもできますが、通常は高度に最適化され、テストされているため、標準的な方法が存在する場合、それが最適です。ただし、このようなメソッドを自分で作成することもできます。これはコーディングの良い練習であり、Java ジュニアの面接で成功するのに役立ちます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION