2019.09.03
配列値の反転
はじめに
配列に格納されている値の順番を逆にする反転処理を行うプログラムを紹介します。
例えば、以下のように配列に値が入っているとき
5, 7, 8, 1, 3, 2
配列の値を反転すると
2, 3, 1, 8, 7, 5
となります。これが配列の反転処理です。
反転処理の説明
ここから、以下の配列を例に反転処理を説明していきます。
反転処理は、配列の先頭と最後の値の入れ替えから始まり、先頭の次の値と最後の1つ前の値を入れ替え、その処理を配列の中心に向かって入れ替えを行っていきます。入れ替える回数は、配列の要素数を2で割り小数以下を切り捨てた値です。
この例は、要素数が6なので、入れ替え回数は6÷2=3回となります。
Javaソースコード
ArrayReverse1.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039
public class ArrayReverse1 { // 配列を反転するメソッド private static void array_reverse( int[] values ) { // 処理回数 int count = values.length / 2; if ( 1 > count ) return; // 交換位置 int s, e; // 反転処理 s = 0; // 先頭の添え字 e = values.length - 1; // 最後の添え字 for ( int i = 0; i < count; ++ i ) { // 交換処理 int w = values[ s ]; values[ s ] = values[ e ]; values[ e ] = w; ++ s; -- e; } } // メイン public static void main( String[] args ) { // 数値群 int[] values = { 5,7,8,1,3,2 }; // 配列の値を反転 array_reverse( values ); // 結果を確認 for ( int i = 0; i < values.length; ++ i ) { System.out.println( values[ i ] ); } } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis ArrayReverse1.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac ArrayReverse1.java
実行
C:\talavax\javasample>java ArrayReverse1
出力結果
2 3 1 8 7 5
Javaソースコードの解説
002 003 004
// 配列を反転するメソッド private static void array_reverse( int[] values ) {
005 006 007
// 処理回数 int count = values.length / 2; if ( 1 > count ) return;
値を入れ替える回数をint型の変数countに代入しています。回数は、配列valuesの要素数values.lengthを2で割った値です。これは整数の割り算なので小数以下の値は、切り捨てになります。
009 010 011 012 013 014
// 交換位置 int s, e; // 反転処理 s = 0; // 先頭の添え字 e = values.length - 1; // 最後の添え字
015 016 017 018 019 020 021 022 023
for ( int i = 0; i < count; ++ i ) { // 交換処理 int w = values[ s ]; values[ s ] = values[ e ]; values[ e ] = w; ++ s; -- e; }
for文でcount回のループを作成しています。そのループの中で、values[ s ]とvalues[ e ]の値を入れ替えています。また、変数sをインクリメント、変数eをデクリメントし、入れ替えたい対象の添え字を配列の中心に近づけています。
以上が配列の反転方法についての説明です。
Javaソースコード byte型/short型/float型/double型
ArrayReverse_byte.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039
public class ArrayReverse_Byte { // 配列を反転するメソッド private static void array_reverse( byte[] values ) { // 処理回数 int count = values.length / 2; if ( 1 > count ) return; // 交換位置 int s, e; // 反転処理 s = 0; // 先頭の添え字 e = values.length - 1; // 最後の添え字 for ( int i = 0; i < count; ++ i ) { // 交換処理 byte w = values[ s ]; values[ s ] = values[ e ]; values[ e ] = w; ++ s; -- e; } } // メイン public static void main( String[] args ) { // 数値群 byte[] values = { 5,7,8,1,3,2 }; // 配列の値を反転 array_reverse( values ); // 結果を確認 for ( int i = 0; i < values.length; ++ i ) { System.out.println( values[ i ] ); } } }
ArrayReverse_short.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039
public class ArrayReverse_Short { // 配列を反転するメソッド private static void array_reverse( short[] values ) { // 処理回数 int count = values.length / 2; if ( 1 > count ) return; // 交換位置 int s, e; // 反転処理 s = 0; // 先頭の添え字 e = values.length - 1; // 最後の添え字 for ( int i = 0; i < count; ++ i ) { // 交換処理 short w = values[ s ]; values[ s ] = values[ e ]; values[ e ] = w; ++ s; -- e; } } // メイン public static void main( String[] args ) { // 数値群 short[] values = { 5,7,8,1,3,2 }; // 配列の値を反転 array_reverse( values ); // 結果を確認 for ( int i = 0; i < values.length; ++ i ) { System.out.println( values[ i ] ); } } }
ArrayReverse_float.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039
public class ArrayReverse_Float { // 配列を反転するメソッド private static void array_reverse( float[] values ) { // 処理回数 int count = values.length / 2; if ( 1 > count ) return; // 交換位置 int s, e; // 反転処理 s = 0; // 先頭の添え字 e = values.length - 1; // 最後の添え字 for ( int i = 0; i < count; ++ i ) { // 交換処理 float w = values[ s ]; values[ s ] = values[ e ]; values[ e ] = w; ++ s; -- e; } } // メイン public static void main( String[] args ) { // 数値群 float[] values = { 5.0f,7.0f,8.0f,1.0f,3.0f,2.0f }; // 配列の値を反転 array_reverse( values ); // 結果を確認 for ( int i = 0; i < values.length; ++ i ) { System.out.println( values[ i ] ); } } }
ArrayReverse_double.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039
public class ArrayReverse_Double { // 配列を反転するメソッド private static void array_reverse( double[] values ) { // 処理回数 int count = values.length / 2; if ( 1 > count ) return; // 交換位置 int s, e; // 反転処理 s = 0; // 先頭の添え字 e = values.length - 1; // 最後の添え字 for ( int i = 0; i < count; ++ i ) { // 交換処理 double w = values[ s ]; values[ s ] = values[ e ]; values[ e ] = w; ++ s; -- e; } } // メイン public static void main( String[] args ) { // 数値群 double[] values = { 5.0,7.0,8.0,1.0,3.0,2.0 }; // 配列の値を反転 array_reverse( values ); // 結果を確認 for ( int i = 0; i < values.length; ++ i ) { System.out.println( values[ i ] ); } } }
以上です。