2012-03-09 75 views
1

我需要幫助我寫一段代碼。我想計算一個數組的中位數。最初這些類型都是整數,並且用整數除法得出中值,這給了我一個錯誤的答案。我改變了一切雙打,但我得到一個類型不匹配的錯誤,說我不能將雙打轉換爲沒有意義的整數。有人可以幫忙嗎?這是我的代碼:Java中位錯誤

public class MedianTest { 

    public static void main(String[] args) { 

     double median = 0; 
     double myValues[] = { 1, 2, 3, 4 }; 

     double arrayHalfOdd = ((myValues.length - 1)/2) + 1; 
     double arrayHalfEven = ((myValues.length - 1)/2); 

     if ((myValues.length - 1) % 2 == 0) { 
     median = (myValues[arrayHalfEven] + myValues[arrayHalfEven + 1])/2; 
     } else { 
     median = myValues[arrayHalfOdd]; 
     } 
     System.out.print(median); 
    } 

} 

的錯誤是在myValues [arrayHalfEven]和myValues [arrayHalfOdd]

通過這不是功課

+3

不要忘記讓你的代碼安全只對一個元素列表... – Adam 2012-03-09 23:24:28

回答

1

最終的答案:

if (myValues.length == 0) { 
     throw new IllegalStateException(); 
    } 
    else if (myValues.length == 1) { 
     return myValues[0]; 
    } 
    else { 
     int halfRoundedUp = myValues.length/2; 
     if (myValues.length % 2 == 0) { // even count, average the middle values 
      return (myValues[halfRoundedUp - 1] + myValues[halfRoundedUp])/2; 
     } 
     else { // odd, take the middle value 
      return myValues[halfRoundedUp]; 
     } 
    } 
1

不能使用雙陣列作爲的方式index:arrayHalfOdd和arrayHalfEven

使這些傢伙ints。

1

如果我理解你的話,你可以使用Math.round(double d)或Math.trunc(double d);

int arrayHalfOdd = Math.round(((myValues.length - 1)/2)) + 1; 
int arrayHalfEven = Math.round(((myValues.length - 1)/2)); 
1

您使用雙值arrayHalfEvenarrayHalfOdd將數組索引到數組中。

0

此行

median = (myValues[arrayHalfEven] + myValues[arrayHalfEven + 1])/2; 

這行

median = myValues[arrayHalfOdd]; 

使用的是雙變量arrayHalfEven和arrayHalfOdd作爲數組索引。如果編譯器允許使用雙數組索引,則可以嘗試訪問非整數數組索引處的位置(例如array [1.5]),這會導致瘋狂的內存訪問併發症。所以,它會拋出一個錯誤。

幸運的是,arrayHalfEven和arrayHalfOdd的類型不影響編譯器是否使用整數除法。

整數除法只有在均爲時,方程的分子和分母纔是整數。數組下標不是分子或分母的一部分;他們選擇來自陣列的分子。

所以如果數組元素(分子)是雙打的,你不會得到整數除法。如果你想他們是整數,你仍然可以防止整數除法通過使您的文字分母雙,這樣的:

median = (myValues[arrayHalfEven] + myValues[arrayHalfEven + 1])/2.0; 

那麼你不會得到整數除法即使數組項是整數。