2011-05-20 124 views
1

我有一个包含以下元素的列表。如何从列表中排除某些元素

List<String> numbers = new ArrayList<String>(); 
numbers.add("1"); 
numbers.add("2"); 
numbers.add("3"); 

如何在没有说"1"的情况下获得列表子集?是否有一个更简单的函数可以对任何类型的List进行操作。

回答

3

你可以使用Guava创建一个过滤Collection观点:

Collection<String> filtered = Collections2.filter(numbers, 
    Predicates.not(Predicates.equalTo("1"))); 

这是原来的List的实时取景,所以这是非常有效的创建,但可能没有效率取决于你需要如何使用使用它,过滤后的收藏与原始收藏相比有多小。你可以把它复制到一个新的列表,如果将工作做得更好。

List<String> filteredList = Lists.newArrayList(filtered); 

创建包含除非你不想要的所有元素的副本列表的最简单方法是使用一个简单的循环for

List<String> copy = new ArrayList<String>(); 
for (String number : numbers) { 
    if (!"1".equals(number)) 
    copy.add(number); 
} 

如果您想要修改原始列表,请使用numbers.removeAll(正如@Robin Green所述)。

0

List.subList(int fromIndex, int toIndex)

编辑:可能是我不明白的问题。

@Op。你想删除某个值的项目,还是想要在两个索引之间查看?

+0

我只知道价值,没有关于指数的任何信息。 – Joe 2011-05-20 18:06:41

+0

啊,好的。你会怎么做,如果只有一个,或者可以有几个? – Kaj 2011-05-20 18:07:23

+0

只有一个而不是很多 – Joe 2011-05-20 18:10:01

0

是的,比如说从列表中删除1(S),你可以这样做:

int i = 0; 
while((i = numbers.indexOf("1")) > -1) { 
    numbers.remove(i); 
} 

您可以用对象的列表做到这一点,也还是一个过滤标准。

编辑:只会有一个而不是很多?然后,只需做:

int i = 0; 
if((i = numbers.indexOf("1")) > -1) { 
    numbers.remove(i); 
} 
+2

这样做的效率很低,因为每次删除时都会重新开始迭代。更好的办法是使用迭代器,并在删除每个匹配项后通过它。 – ColinD 2011-05-20 18:14:38

3

你可以看看Guava libraries这对任何集合类型的过滤器的方法。
这里是some examples供您参考。

如果您不想使用第三方库,则必须手动迭代列表并需要复制不符合条件的元素。

+0

是的,这是一个更一般的解决方案(对问题的一种可能的解释!),但它可能比提问者目前需要的更普遍。 – 2011-05-20 18:06:49

+1

是的,但你的答案会修改现有的列表..这可能不是要求。 – Premraj 2011-05-20 18:13:15

7

问题不明确。

numbers.remove("1");将删除任何列表中的第一个“1”。如果您可能有重复的元素,请使用numbers.removeAll (Collections.singletonList ("1"));删除所有元素。

如果另一方面想要获取列表的子范围,请使用subList方法。

+1

有没有办法实现这一点,而无需修改原始列表。我假设你应该克隆它,每次你想删除 – Joe 2011-05-20 18:15:25

+0

@Joe查看ColinD的答案。顺便说一句,如果你真的对函数式编程感兴趣(编程没有破坏性更新),请查看Scalaz for Scala(它运行在JVM上)或Haskell(不会)或F#(它们运行在.NET上)。 – 2011-05-20 19:19:56