2017-07-10 16 views
1
public void closestNumber(){ 
    int a[] = {-1, 58, 32, 16, 54}; 
    int current=a[0]; 
    int diff=Maths.abs(32-current); 
    int index=0; 

    for (int i=0; i<a.length; i++){ 
    int newDiff= Maths.abs(32-a[i]); 
    if (newDiff< diff){ 
    index=i; 
    } 
    System.out.println(index); 
    } 
} 

配列に32に最も近い番号のインデックス番号を見つけるために、上記の貼り付けられたメソッドを記述しました。しかし、私はエラー "無効な変数の宣言"を取得し続けます。 私は完全な初心者です。私は間違っている可能性がある箇所を見つけることができません。どんな助力も高く評価されます。Javaの配列で32に最も近い番号のインデックス番号を見つける

ベスト。

+0

は、あなたが持っていると仮定すると、クラスの数学が定義されている、コードは正常です。 – Compass

+1

'Maths.abs'の代わりに' java.lang.Math.abs() 'を使いたいかもしれません。 https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#abs(int) – Rohan

答えて

1

二つのこと:

  1. あなたのエラーであるだけでタイプミス=あなたはnewDiffdiffをリフレッシュするのを忘れていない数学クラスが、Mathまたはロジックでは、フルjava.lang.Math

  2. にありより近い要素が見つかった場合。声明は次のように見なければならない場合 はそうあなた:

    if (newDiff < diff){ 
        diff = newDiff; 
        index=i; 
    } 
    
1

のJava 8のストリームでこれを行う方法があります:

public int indexOfClosestNumber(int number, int... a) { 
    return IntStream.range(0, a.length) 
     .boxed() 
     .min(Comparator.comparingInt(i -> Math.abs(number - a[i]))) 
     .orElse(-1); 
} 

ように、私はメソッドの名前と署名を変更しましたより有意義で使いやすいです。

コードの考え方は、intの範囲があり、提供されたコンパレータによれば、その範囲のインデックス内で最小値を探したいということです。 Stream.minメソッドのコンパレータを指定できるようにするには、IntStreamの代わりにStream<Integer>が必要です。そのため、.boxed()を使用しています。次に、コンパレータは、配列の各要素の距離を提供されたnumberと比較することによって動作します。 Stream.minメソッドはOptional<Integer>を返しますので、Optional.orElseメソッドをデフォルト値で使用する必要があります(これは、指定された配列が空の場合に返されます)。

int index = indexOfClosestNumber(32, -1, 58, 31, 16, 54); 

System.out.println(index); // 2 
+0

質問のタイトルを読んだ後すぐに私は「天井」について考えましたが、これはまた、 – Eugene

+0

また、 'min(Comparator.comparingInt(i - > Math.abs(number-a [i])))' – shmosel

1

あなたは要素があなたの配列に一意であることを保証することができる場合、それはTreeMap#ceilingで行うことができます:、上記の方法を使用して、以下のように行うには

int a[] = { -1, 58, 32, 16, 54 }; 
    int index = IntStream.range(0, a.length) 
      .boxed() 
      .collect(Collectors.toMap(x -> a[x], x -> x, (left, right) -> left, TreeMap::new)) 
      .ceilingEntry(32).getValue(); 
+0

これは配列内で重複をサポートしていると思います。あなたはちょうど一致する最初のアイテムを返します... –

関連する問題