2011-05-20 94 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