2014-01-21 54 views
0

我對編碼還很陌生。我試圖採用填充「x」數量元素的數組,並且需要找到一系列數字。參數需要一個數組,一個最小數字和一個最大數字。最終結果需要包括它們之間的最小值,最大值和數字。這是一種什麼我談論的例子:卡住在java中使用數組

The starting array:[2, 8, 7, 3, 4] 
Min value: 1 
Max value: 5 
End result: [2, 3, 4] 

我希望這不是混亂,而且我有種解釋的不夠好理解。

我的代碼是這樣的:

public static int[] range(int[] a, int low, int high) 
{ 
    int[] rangeArray = new int[0]; 

    for (int i = low; i <= high; i++) 
    { 
    if (low >= a.length && high <= a.length) 
    { 
     rangeArray[i] = a[i]; 
    } 
    } 

    return rangeArray; 
} 
+10

'INT [] rangeArray =新INT [0]的;'怎麼辦你認爲這是嗎? –

+4

從這裏開始:[使用數組的Oracle教程](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html) –

+3

不需要粗魯。他所描述的功能的輸入/輸出是正確的。 –

回答

5

你的第一個問題是在這裏:

int[] rangeArray = new int[0]; 

這樣做是實例,並命名爲rangeArray型數組。然後將其初始化爲長度0。因此,添加到此數組的任何內容都會超出範圍。您應該將其初始化爲返回結果的長度;在這種情況下很困難。

然後我們的代碼塊:

for (int i = low; i <= high; i++) //start at the lowest possible number and go to the highest 
{ 
    //check for validity 
} 

有一點這裏的概念問題;你從lowhigh迭代。如果low非常低(-1百萬?)和high同樣非常高?這是很多想法,沒有結果。

相反,通過你實際上是給數組讓循環:

for (int idx = 0; idx < a.length; idx++) { 
    //Check the value of int, if it is in the desired range, save it. 
} 

最後,讓我們來看看這個:

if (low >= a.length && high <= a.length) 

這大致翻譯爲「如果我的期望範圍的低端大於我檢查的數字列表的長度,並且我的範圍的高端小於同樣的長度,請選擇'真正'分支。「這不是你要找的。

取而代之,您希望「如果當前指數值介於我的最低值和最高值之間,請保留它。」

if (a[idx] >= low && a[idx] <= high) 

滾動起來,我們得到:

public static int[] range(int[] a, int low, int high) 
{ 
    int[] rangeArray = new int[a.length];//this is the most we will need 
    int numbersFound = 0;//to keep track of result array index  

    for (int idx = 0; idx < a.length; idx++) { 
    { 
    if (a[idx] >= low && a[idx] <= high) 
    { 
     rangeArray[numbersFound++] = a[i]; 
    } 
    } 

    return rangeArray; 
} 

注意,在這種情況下,你的陣列將有可能在年底一些空細胞。使用前請注意!

+1

非常感謝你,我非常感謝你解釋這一切。 – furuf

2

您的邏輯錯誤。

  1. 該數組的大小被賦值爲零。如果沒有空間,你將如何在該容器中存儲某些東西?
  2. 您的循環計數器已關閉。
    • 遍歷陣列的最簡單的方法是從頭開始,並移動到端
    • 陣列索引從0
    • 數組索引開始上升到(長度 - 1)
  3. 你需要在你的測試中使用高和低。

僞代碼

initialize result to the same size as the input 
foreach(item in array) 
{ 
    if(item is in range) { 
     add item to result 
    } 
} 

言歸正傳代碼

results = new Int[a.length()]; 
int resultsPosition = 0; 
for(int i = 0; i < a.length(); i++) { 
    if(a[i] => low && a[i] <= high) { 
      results[reultsPosition] = a[i]; 
      resultsPosition++; 
    } 
} 
1

的代碼int[] rangeArray = new int[0]該生產線與實例0長度的數組你不能用這個數組做任何事情!

由於我們知道起始數組([2,8,7,3,4]),我們知道大小。所以讓我們將數組長度更改爲5,因爲我們將所有的數字添加到此數組中,所有項目都將滿足邊界條件),從而使代碼行現在爲int[] rangeArray = new int[5]

接下來,讓我們看看你的循環。我假設你想採取的路徑是看每個值,看看它是最小的>=,也是<=的最大值。所以,我們應該建立第二個數組。我們稱之爲boundaryArray。讓我們也把這個長度作爲5,因爲所有的元素實際上都可以滿足條件。所以我們有這條線:int[] boundaryArray = new int[5]。那麼,讓我們循環看看這些元素是否匹配。讓我們來看看下面的代碼:

int minimum = 1; 
int maximum = 5; 
int counter = 0; 
for (int i = 0; i < rangeArray.length; i++) 
{ 
    if (rangeArray[i] >= minimum && rangeArray[i] <= maximum 
    { 
    boundaryArray[counter] = rangeArray[i]; 
    counter++; 
    } 
} 

我們首先初始化兩個整數,我們的最小值和最大值(1和5分別)。接下來,我們有一個計數器,以跟蹤已添加了多少物品。然後,我們使用for循環遍歷我們的原始數組,並且每次循環時我們都會增加1。然後,如果我們正在查看的數字> =最小值 < =最大值,我們將數字添加到邊界數組並將計數器增加。

如果要打印列表,只需從0運行另一個for循環到boundaryArray.length並使用System.out.println(boundayArray[i].toString())打印出陣列,其中i是for-loop迭代變量。

1

這裏有兩個主要問題。首先,你正在初始化你的數組,其中有0個元素,這意味着你永遠無法做任何事情。上面寫着int[] rangeArray = new int[0]應行:

int[] rangeArray = new int[a.length]; 

這表示你希望你的新的數組是一樣大,你正在使用作爲輸入值的數組。由於我們基本上是過濾參數數組,所以它不應該比它大,所以我們不會有超出範圍的錯誤。

現在下一部分,如果你的for循環。您正在使用索引來過濾元素的值。這不是你想要做的。相反,你想迭代整個數組的內容。您可以使用類似這樣的foreach循環,然後檢查當前索引處的值是否在最小值內。

int counter = 0; //keep track of our spot in our new array 
for(int i : a) //iterate over all the elements of a using int i as our iterator 
{ 
    if(i >= min && i<= max) //check if it is within our allowed range 
    { 
     rangeArray[counter] = i; //add it to the new array 
     counter++;    //increment counter to add to next spot in our new array 
    } 
} 
1
public static int[] range(int[] a, int low, int high) { 

    Arrays.sort(a); // sort the aray first 

    int length = 0; // number of numbers within the range 

    for (int i = 0; i < a.length; i++) { // check all ints in the array 

     // if the int is in the range, add 1 to the length 
     if (low <= a[i] && high >= a[i]) { 
      length++; 
     } 
    } 

    // determine array size with number of numbers found within the range 
    int[] rangeArray = new int[length]; 

    for (int i = 0; i < a.length; i++) // for every int in the array 
    { 
     if (low <= a[i] && high >= a[i]) // if number is between the range 
     { 
      rangeArray[i] = a[i]; // add it to the range array 
     } 
    } 
    return rangeArray; 
} 

public static void main(String args[]) { 
    int[] array = {2, 8, 7, 3, 4}; 
    int[] rangeArray = range(array, 1, 5); 

    System.out.print(Arrays.toString(rangeArray)); 
} 

輸出:

[2, 3, 4] 
2

爲了方便和可讀性,我不會急於生成一個數組並稍後剪掉它,因爲這似乎很浪費的(如果我有一個數組很多整數,但只有少數匹配?)

我會去類似的東西:

List<Integer> temp = new List<>(); 
    for(int i = 0 ; i < a.length ; i++){ 
     if (low <= a[i] && high >= a[i]){ 
      temp.add(a[i]); 
     } 
} 
return ArrayUtils.toPrimitive(temp.toArray(new Integer[temp.size()])); 

這一點,在很大程度上,是因爲我不好用指標,所以我嘗試使用STL而不是陣列時可能