ゆるゆるプログラミング

・最も近い値の取得

指定した値に1番近い値を配列から探し、その値を表示するプログラムをを紹介します。

配列に格納されている値と指定した値の差の絶対値を計算し、その差が最も小さくなる配列の値が、指定値に最も近い値です。

NearestValue1.java
001:    public class NearestValue1 {
002:    	// 最も近い値を格納した配列の添え字を求める
003:    	public static int getNearestValue( int[] list, int v )
004:    	{
005:    		// 変数の宣言
006:    		int i;		// ループ用
007:    		int num;	// 配列の添え字
008:    		int minv;	// 配列値-指定値vの絶対値
009:    
010:    		// 配列の個数が1未満の処理
011:    		if ( 1 >list.length ) return -1;
012:    
013:    		// 指定値と全ての配列値の差を比較
014:    		num = 0;
015:    		minv = Math.abs( list[ 0 ] - v );
016:    		for ( i = 1; i < list.length; ++ i ) {
017:    			if ( Math.abs( list[ i ] - v ) < minv ) {
018:    				num = i;
019:    				minv = Math.abs( list[ i ] - v );
020:    			}
021:    		}
022:    
023:    		return num;
024:    	}
025:    
026:    
027:    	// メイン
028:    	public static void main( String[] args )
029:    	{
030:    		// 数値群
031:        		int[] list = { 344, 767, -645, 96, -432, 3488, 213, 195 };
032:    
033:    		// 最も近い値を格納した配列番号を取得
034:    		int v = -200;
035:    		int num = getNearestValue( list, v );
036:    
037:    		// 結果の表示
038:    		if ( 0 > num )
039:    			System.out.println( "値の取得に失敗しました!" );
040:    		else
041:    			System.out.println( v + "に最も近い値は" + list[ num ] );
042:    	}
043:    }

NearestValue1の出力結果

-200に最も近い値は-432

ここからは、このソースコードを上から順番に解説していきます。

001:    public class NearestValue1 {

クラス名を、NearestValue1としています。

002:    	// 最も近い値を格納した配列の添え字を求める
003:    	public static int getNearestValue( int[] list, int v )

指定値(v)に1番近い値を持つ配列(list[])の添え字を求めるメソッドです。

005:    		// 変数の宣言
006:    		int i;		// ループ用
007:    		int num;	// 配列の添え字
008:    		int minv;	// 配列値-指定値vの絶対値

メソッドで使う変数を宣言しています。

010:    		// 配列の個数が1未満の処理
011:    		if ( 1 >list.length ) return -1;

配列(list[])に格納されている値が1個未満の場合、配列添え字を求めることができないので、結果として-1を返しています。

013:    		// 指定値と全ての配列値の差を比較
014:    		num = 0;
015:    		minv = Math.abs( list[ 0 ] - v );

求める値の候補(初期値)として配列の先頭(list[0])の情報を変数numと変数minvに代入しています。numには配列の先頭の添え字である0、minvには指定値vと配列の先頭の値(list[0])との差の絶対値を代入しています。

016:    		for ( i = 1; i < list.length; ++ i ) {
017:    			if ( Math.abs( list[ i ] - v ) < minv ) {
018:    				num = i;
019:    				minv = Math.abs( list[ i ] - v );
020:    			}

指定値と配列の2番目の値から最後の値の差を計算していき、その差がminvより小さくなるときにnumとminvの値を変更していきます。

023:    		return num;

for文を抜けたときのnumの値が求めたい配列添え字になっています。その値をreturn文で返します。

027:    	// メイン
028:    	public static void main( String[] args )

このmainメソッドからプログラムを実行します。

030:    		// 数値群
031:        		int[] list = { 344, 767, -645, 96, -432, 3488, 213, 195 };

int型配列を宣言し、任意の値を8個格納しています。

033:    		// 最も近い値を格納した配列番号を取得
034:    		int v = -200;
035:    		int num = getNearestValue( list, v );

指定した値(v=-200)から1番近い値をgetNearestValueで検索しています。numに検索した配列添え字が代入されます。

037:    		// 結果の表示
038:    		if ( 0 > num )
039:    			System.out.println( "値の取得に失敗しました!" );
040:    		else
041:    			System.out.println( v + "に最も近い値は" + list[ num ] );

numが0未満の場合、結果が無いことを表しているので、"値の取得に失敗しました!" というメッセーを表示しています。numが0以上の時は値が取得できたことを表しているので、指定値と配列の値を表示しています。

■関連コンテンツ

配列 同じ型の変数をまとめた配列について解説
for文 繰り返し処理に使用するfor文について解説

■新着情報

2017.11.17 N値化 カラー画像をN値化する方法について解説
2017.11.16 最も近い値の取得 指定値に最も近い配列の値を取得する方法を解説
2017.10.02 アルファ値(透過) アルファ値(透過)について

Topへ