2019.09.03

配列値の反転

はじめに

配列に格納されている値の順番を逆にする反転処理を行うプログラムを紹介します。

例えば、以下のように配列に値が入っているとき

	5, 7, 8, 1, 3, 2

配列の値を反転すると

	2, 3, 1, 8, 7, 5

となります。これが配列の反転処理です。

反転処理の説明

ここから、以下の配列を例に反転処理を説明していきます。

配列の反転処理 元データ1

反転処理は、配列の先頭と最後の値の入れ替えから始まり、先頭の次の値と最後の1つ前の値を入れ替え、その処理を配列の中心に向かって入れ替えを行っていきます。入れ替える回数は、配列要素数を2で割り小数以下を切り捨てた値です。

この例は、要素数が6なので、入れ替え回数は6÷2=3回となります。

配列の反転処理 値の交換1
配列の反転処理 値の交換2
配列の反転処理 値の交換3

このように配列の中心に向かっての値の入れ替えで、配列の値を反転することができます。

次の例は、要素数が7の配列です。入れ替え回数は7÷2=3.5の小数以下を切り捨てた3回となります。

配列の反転処理 元データ2

要素数奇数の場合は、真ん中の値は入れ替えの対象になりません。

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 )
	{

配列を反転するメソッドarray_reverseを定義しています。引数int型配列valuesを渡します。

このメソッドでは、配列valuesの値を変更します。新しい配列を作成しません。

005
006
007
		// 処理回数
		int count = values.length / 2;
		if ( 1 > count ) return;

値を入れ替える回数をint型変数countに代入しています。回数は、配列valuesの要素数values.lengthを2で割った値です。これは整数割り算なので小数以下の値は、切り捨てになります。

countが0のとき、処理をする必要がないのでreturn文メソッドを抜けます。

009
010
011
012
013
014
		// 交換位置
		int s, e;

		// 反転処理
		s = 0;			// 先頭の添え字
		e = values.length - 1;	// 最後の添え字

入れ替えに使う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型

ここから、byte型short型float型double型配列を反転するJavaソースコードを紹介します。

以下は、byte型配列反転のJavaソースコードです。

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 ]  );
		}
	}
}

以下は、short型配列反転のJavaソースコードです。

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 ]  );
		}
	}
}

以下は、float型配列反転のJavaソースコードです。

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 ]  );
		}
	}
}

以下は、double型配列反転のJavaソースコードです。

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 ]  );
		}
	}
}

以上です。

関連コンテンツ

同じ型の変数(データ)を複数個まとめて管理するデータの持ちかたがあります。これが配列です。くわしくは、記事をご覧ください。

2016.01.14

処理を繰り返すために使用するfor文について解説しています。

2020.03.23

プログラミングで使う変数って何?

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

プログラミング、ITに関する用語をまとめています。

2022.10.17

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

条件式を判断して処理を分岐する方法を詳しく説明しています。

2023.03.20

メソッドを抜けるときに使用するreturn文について説明しています。

2020.03.20

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

偶数・奇数を判定する方法を詳しく説明しています。興味のある方は、ご覧ください。

2015.11.17

メソッドの定義方法を詳しく解説しています。Javaのサンプルソースコードを使った説明もあります。

2020.03.23

自然数と整数って何が違う?

2020.03.23

Javaの演算子'/'を使って割り算を行った結果と注意点などについて説明。

2020.03.23

繰り返し処理の作り方を解説しています。

2016.03.02

整数型の変数に1を足すインクリメント、1つ引くデクリメントについて詳しく説明しています。

2020.03.23

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

広告