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 )
005 006 007 008
// 変数の宣言 int i; // ループ用 int num; // 配列の添え字 int minv; // 配列値-指定値vの絶対値
010 011
// 配列の個数が1未満の処理
if ( 1 >list.length ) return -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;
027 028
// メイン public static void main( String[] args )
このmainメソッドからプログラムを実行します。
030 031
// 数値群 int[] list = { 344, 767, -645, 96, -432, 3488, 213, 195 };
033 034 035
// 最も近い値を格納した配列番号を取得 int v = -200; int num = getNearestValue( list, v );
037 038 039 040 041
// 結果の表示 if ( 0 > num ) System.out.println( "値の取得に失敗しました!" ); else System.out.println( v + "に最も近い値は" + list[ num ] );
numが0未満の場合、結果が無いことを表しているので、"値の取得に失敗しました!" というメッセーを表示しています。numが0以上の時は値が取得できたことを表しているので、指定値と配列の値を表示しています。
以上です。