2017.11.16

最も近い値を取得

最も近い値を見つける方法

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

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

Javaソースの解説

NearestValue1.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
040
041
042
043
public class NearestValue1 {
	// 最も近い値を格納した配列の添え字を求める
	public static int getNearestValue( int[] list, int v )
	{
		// 変数の宣言
		int i;		// ループ用
		int num;	// 配列の添え字
		int minv;	// 配列値-指定値vの絶対値

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

		// 指定値と全ての配列値の差を比較
		num = 0;
		minv = Math.abs( list[ 0 ] - v );
		for ( i = 1; i < list.length; ++ i ) {
			if ( Math.abs( list[ i ] - v ) < minv ) {
				num = i;
				minv = Math.abs( list[ i ] - v );
			}
		}

		return num;
	}


	// メイン
	public static void main( String[] args )
	{
		// 数値群
    		int[] list = { 344, 767, -645, 96, -432, 3488, 213, 195 };

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

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

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis NearestValue1.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac NearestValue1.java

実行

C:\talavax\javasample>java NearestValue1
-200に最も近い値は-432

Javaソースコードの解説

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

001
public class NearestValue1 {

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

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

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

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

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

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

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

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

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

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

指定値と配列の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
035
		// 最も近い値を格納した配列番号を取得
		int v = -200;
		int num = getNearestValue( list, v );

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

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

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

以上です。

関連コンテンツ

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

2016.01.14

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

2020.03.23

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

2023.03.20

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

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

2020.03.20

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

2020.03.23

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

2022.12.13

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

2020.03.23

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

2020.03.23

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

2020.03.23

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

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

2022.09.10

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

2020.03.23

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

2015.11.29

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

2020.03.23

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

2021.05.18

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

2022.10.25

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

2021.05.18

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

2016.12.16

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

2022.07.07

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

2022.10.17

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

2022.07.27

絶対値の意味と、Math.absメソッドの使い方をソースコードを使って詳しく解説しています。

2020.03.23

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

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

2020.03.23

for文で変数名iがよく使われる理由について説明しています。興味のある方は是非。

2022.08.29

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

2020.03.23

広告