2015-10-14 54 views
0

我有以下代碼;Java:具有自定義值範圍(int)的簡單數組?

int minValForRange = myDataObj.getMinValue(); 
      int maxValForRange = myDataObj.getMaxValue(); 

      String[] arrOfRangesForSelection = new String[maxValForRange]; 

      Logger.d(String.valueOf(minValForRange)); 
      Logger.d(String.valueOf(maxValForRange)); 

      for (int i = minValForRange; i <= maxValForRange; i++) { 
       arrOfRangesForSelection[i] = String.valueOf(i); 
      } 

minValForRange & maxValForRange是動態變量(在這種情況下是1和300),所以它上面的這種情況下的代碼拋出異常:

length=300; index=300 

如何具有從minValueRange索引的數組請?

非常感謝您的任何建議。

+0

你需要有大小MAXVALUE + 1的陣列,因此將有最大價值指數 – NightsWatch

+0

另取您的要求可能是使用某種形式的地圖風格的集合。有一個有趣的討論,和一些建議的解決方案,[這裏](0123)http://stackoverflow.com/questions/12626135/memory-efficient-sparse-array-in-java – fvu

回答

3

如何有一個從minValueRange索引的數組?

你不能在Java中。最好的辦法就是做必要的數學(但我提幾個選擇以下,這實際上只是將其封裝),例如:

int minValForRange = myDataObj.getMinValue(); 
int maxValForRange = myDataObj.getMaxValue(); 

String[] arrOfRangesForSelection = new String[maxValForRange - minValForRange + 1]; 
// Enough room for the range (inclusive) -----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Logger.d(String.valueOf(minValForRange)); 
Logger.d(String.valueOf(maxValForRange)); 

for (int i = minValForRange; i <= maxValForRange; i++) { 
    arrOfRangesForSelection[i - minValForRange] = String.valueOf(i); 
    // The math ------------^^^^^^^^^^^^^^^^^^ 
} 

(注意,我假設maxValForRange以上應該包括在內,因爲這是你怎麼寫你的循環,這就是爲什麼我們在線路分配陣列具有+ 1。)

如果沒有希望maxValForRange被列入(在編程中,我們通常包括下限但不包括上限),你不會對數組分配+ 1,並會在循環使用<而不是<=

int minValForRange = myDataObj.getMinValue(); 
int maxValForRange = myDataObj.getMaxValue(); 

String[] arrOfRangesForSelection = new String[maxValForRange - minValForRange]; 
// No + 1 here --------------------------------------------------------------^ 

Logger.d(String.valueOf(minValForRange)); 
Logger.d(String.valueOf(maxValForRange)); 

for (int i = minValForRange; i < maxValForRange; i++) { 
// Just < here ----------------^ 
    arrOfRangesForSelection[i - minValForRange] = String.valueOf(i); 
} 

如果你願意,你可以平凡寫一個類,將提供getset方法,其做必要的數學計算,這樣你就不必在整個代碼中重複它,然後將你的數組包裝到該類中。

你也可以做一個ArrayList子類,做必要的數學。

+0

我不明白你的數學。 OP通過看到輸出'長度= 300;索引= 300'在堆棧跟蹤。 –

+0

@sᴜʀᴇsʜᴀᴛᴛᴀ:正如我所看到的,主要問題是*「如何獲得一個從minValueRange索引的數組?」*這就是說,我*也解決了確保數組足夠大的問題範圍包括在內。 –

+0

這樣比數學「內聯」更好,就是將數組封裝在一個類中。 – aioobe

0

對數組元素的訪問是基於零的,所以當您嘗試訪問maxValForRange時,必須具有maxValForRange + 1大小;

0

只是使用我< maxVal而不是我< = maxVal。

for (int i = minValForRange; i < maxValForRange; i++) 
    arrOfRangesForSelection[i] = String.valueOf(i);