2014-03-25 44 views
0
public static int [] filterRange(int [] array, int low, int high){ 
     int numbers = 0; 
     for (int i = 0; i < array.length; i++){ 
      if (i <= high && i >= low){ 
       numbers ++; 
      } 
     } 
     int array1 [] = new int [numbers]; 
     for (int i = 0; i < array.length; i++){ 
      if (i <= high && i >= low){ 
       array1[i] = array[i]; 
      } 
     } 

     return array1; 
    } 

我想寫一個方法,不使用任何內置函數。它接受一個數字數組,一個低值和一個高值,並返回一個新數組,其中只包含高位和低位值之間的數字,以及高位和低位值(如果適用)。我想要一個接受數組,低數字,高數字的方法。並返回一個數組之間的數字

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 
at Question_1.filterRange(Question_1.java:41) 
at Question_1.main(Question_1.java:13) 

這是我收到的錯誤消息。

+0

使用高一低,讓您新的數組的大小。分配它。使用從低到高迭代的循環將值複製到新數組中。 – deanosaur

+0

聽起來像我認爲我有,除非我不明白?數字++給我的數量在我的範圍和新的int [數字]之間的數量,使空白數組的大小,但下一部分我不能正確。 – user3457171

+0

沒有偏移量,array1 [i] = array [i + low],我的回答應該更清楚。 –

回答

2

或者僞代碼

這是切片,即將索引從低到高。

newSize = high - low + 1; 
int array1 [] = new int [newSize] 
for int i = 0; i < newSize; i++ 
    array1[i] = array[i + low] 

這是選擇/長手過濾

儘管如此,但我不是一個Java男孩。

public static int [] filterRange(int [] array, int low, int high){ 
     int numbers = 0; 
     for (int i = 0; i < array.length; i++){ 
      if (array[i] <= high && array[i] >= low){ 
       numbers ++; 
      } 
     } 
     int array1 [] = new int [numbers]; 
     int index = 0; 
     for (int i = 0; i < array.length; i++){ 
      if (array[i] <= high && array[i] >= low){ 
       array1[index] = array[i]; 
      index++; // should be inside the if, I'm a twit 
      } 
     } 

     return array1; 
    } 

我建議你看看java中的列表,那麼你將不需要兩次都做。不是Java的男孩,但我會感到驚訝,如果它沒有像Ruby的

array1.select{|i| (i >= low) && (i <= high)} 
+1

更好地使用'System.arraycopy'它比'for'循環快得多 –

+1

嗯,是的,但OP似乎想要做到這一點。 :) –

+0

對我來說,這應該是完美的工作,我不明白爲什麼,但我仍然越來越出界 – user3457171

0

如果高和低的數字數組索引,託尼已經回答了你的問題。如果高位和低位數字是數組值,請參閱下面的代碼。

public static int [] filterRange(int [] array, int low, int high){ 
    int[] array1 = new int[array.length]; 
    int numbers = 0; 
    for (int i = 0; i < array.length; i++){ 
    ///// this is what you really mean, right? 
     if (array[i] <= high && array[i] >= low){ 
      array1[numbers] = array[i]; 
      numbers ++; 
     } 
    } 
    return Arrays.copyOfRange(array1, 0, numbers); 

}

那麼你可以使用一個for循環輸出結果

int[] result = new int[numbers]; 
for (int i = 0; i < numbers; i++) result[i] = array1[i]; 
return result; 
+0

是的,這給出了正確的輸出,但我想長時間做它。而不是使用Arrays.copyOfRange。 – user3457171

+0

我已更新我的回覆。 – RoverMAX

0

這是非常接近:

public static int[] filterRange(int[] array, int low, int high){ 
    int size = 0; 
    for (int i = 0; i < array.length; i++){ 
     if(array[i]>=low && array[i]<=high) size++; 
    } 
    int[] array1 = new int[size]; 
    for(int i=0, j=0; i< array.length; i++) { 
     if(array[i]>=low && array[i]<=high) array1[j++] = array[i]; 
    } 
    return array1; 
} 

和公正yucks:

public static <T extends Comparable<T>> List<T> filterRange(T[] array, T low, T high){ 
    List<T> list = new ArrayList<T>(); 
    for(int i=0, j=0; i< array.length; i++) { 
     if(array[i].compareTo(low)>=0 && array[i].compareTo(high)<=0) list.add(array[i]); 
    } 
    return list; 
} 
+0

與我的第一個回答隊友一樣的問題。 Guy根據高低不過濾來進行過濾。 –

+0

@TonyHopkinson DOH! – deanosaur

0

的快速實現:

public static Integer[] filterRange(int[] array, int low, int high) { 
    List<Integer> aux = new ArrayList<Integer>(); 

    for (int i : array) { 
     if (i <= high && i >= low) { 
      aux.add(i); 
     } 
    } 
    return aux.toArray(new Integer[aux.size()]); 
} 
相關問題