2017-07-10 102 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

您可能想使用'java.lang.Math.abs()'而不是'Maths.abs'。 https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#abs(int) – Rohan

回答

1

兩件事情:

  1. 你的錯誤只是一個錯字=沒有數學小號類,但Math或全部java.lang.Math

  2. 在邏輯分析,你忘了刷新diffnewDiff如果找到更近的元素。 所以你的if語句必須像:

    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 s的範圍,我們希望根據提供的比較器在該範圍的索引中找到最小值。爲了能夠爲Stream.min方法指定比較器,我們需要一個Stream<Integer>而不是IntStream,這就是爲什麼我使用了.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

我認爲這支持在數組中重複。你只會返回匹配的第一個項目... –

相關問題