2014-03-26 137 views
0

我有一個要求,可以編寫一個方法來過濾最小和最大範圍之間的ArrayList。因此,該方法接受List,int min和integer max。 這是我寫的方法。根據條件篩選ArrayList

public static List<Integer> filterRange(final List<Integer> l3,int min,int max) 
{ 
    System.out.println(l3); 
    Iterator<Integer> iter = l3.iterator(); 
    while (iter.hasNext()) { 
     int i=iter.next(); 
     if (i<=max && i>=min) { 
      iter.remove(); 
     } 
    } 
    System.out.println(l3); 
    return l3; 

} 

但是,這不會做所需的功能。對此的建議很好。

感謝

回答

0

你不能使用next()函數兩次這樣。它每次都得到下一個元素。嘗試將next()的返回存儲在本地變量中,然後再與min/max進行比較。

+0

,謝謝,我已經修改了代碼。它現在正常工作:) – user3400060

1

您需要獲取每個元素,然後對其進行測試。目前,您連續兩次致電next()。所以,如果你有一個包含列表(1,2,3,4),您開始第一次迭代中,這條線:

if (iter.next().intValue()<=6 && iter.next().intValue()>=2) 

等同於:

if (1<=6 && 2>=2) 

爲了避免存儲元素,然後執行測試。你不使用你minmax參數值

while (iter.hasNext()) { 
     Integer i = iter.next(); 
     if (i.intValue()<=6 && i.intValue()>=2) { 
      iter.remove(); 
     } 
    } 

注意。另外我不知道你爲什麼使你的方法是通用的。


你的編輯後,遠離了原來的職位,問題是,你叫 next()不知道,如果你的列表中包含了一些元素,即使有,也將無限循環,因爲你不打電話 next()內您的循環(因爲 hasNext()將始終返回 true)。因此,它應該是:

while (iter.hasNext()) { 
     int i=iter.next(); 
     if (i<=6 && i>=2) { 
      iter.remove(); 
     } 
    } 

請注意,您的列表中將包含null元素,所以試圖拆箱的Integer對象的值時,這條線int i=iter.next();可以拋出NPE。

最後,如果你正在使用(再次意識到null元素的),你可以這樣做:

l.removeIf(i -> i >= min && i <= max); 
+0

無需調用var i上的intValue方法。 – Arjit

+0

@Arjit是的,它會自動取消裝箱。我只是複製粘貼OP的代碼(在他將它編輯到遠離原始帖子的地方之前)。 –

+0

謝謝,我改了:) – user3400060

1

這裏的filterRange功能的更寬泛的版本。這需要爲PARAMS:

  • 比較的對象List<T>其中<T extends Comparable<T>>
  • 高值的物體T
  • 低值物體T

它返回相同的清單,但與任何對象的列表除去最小/最大範圍之外。

函數遍歷T的列表並使用Comparable接口方法compareTo()將列表中的每個T與高值和低值進行比較。如果項目落入範圍內,則將該項目添加到新列表中。

public static <T extends Comparable<T>> List<T> filterRange(List<T> list, T low, T high){ 
    List<T> newlist = new ArrayList<T>(); 
    for(T t:list) { 
     if(t.compareTo(low)>=0 && t.compareTo(high)<=0) { 
      newlist.add(t); 
     } 
    } 
    return list; 
} 

我這個代碼

String[] array = new String[]{"apple", "banana", "cherry", 
           "grape", "kiwi", "lemon", 
           "lime", "orange", "pear", 
           "plum", "strawberry"}; 
    List<String> strings = Arrays.asList(array); 
    List<String> array1 = filterRange(strings,"c","h"); 

測試,並得到:

cherry 
grape 
+0

你能否在你的回答中解釋這段代碼? –

+0

@TheGuywithTheHat - 這個帖子最初指定了一個通用函數,所以我很快就拋出了這個,但它有一些問題。我清理了一下,實際測試了它。 – deanosaur