2014-03-26 135 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