過濾

2016-03-01 52 views
2

例如後取下原始列表中的元素,在C#我可以選擇從原始列表中的元素:過濾

List<string> result = first_mas.Where(d => d == "1").First().ToList(); 

如果我從result刪除元素,相同的元件也將被從first_mas除去。

在Java中,我可以做這樣的事情:

List<String> result = first_mas.stream().filter(d -> d.equals("1")).collect(Collectors.toList()); 

但是,如果我從result刪除元素,他們將不會從原始數組中刪除。

過濾後是否可以從原始列表中刪除元素?

UPD:

public void doSomething(List<String> list){ 
    // here remove something from list, should also be removed from original list 
    // i don't have link to original list here 
} 

doSomething(first_mas.stream().filter(d -> d.get(0).equals("1")).collect(Collectors.toList())); 
+1

如果您無權訪問原始列表,則無法移除/訪問它的元素。 – Don

+0

我不明白這個問題。你可以擴展一個示例輸入/輸出嗎?你還可以擴展你的用例嗎? – Tunaki

+0

我沒有看到使用Java8流的方式。我知道Google Guava的收集實用程序可以執行以下操作:Collections.filter實用程序方法提供原始列表的「實時視圖」,並且修改會傳播回原始列表。雖然這不是一回事。 – GPI

回答

3

你可以試試這個:

List<String> original; 
original.removeAll(result); 

當你得到的結果,那麼你可以很容易地刪除所有這些都在結果List

+0

我已更新我的問題。在我從已過濾列表中刪除元素的方法中,我沒有鏈接到原始數組。 – Suvitruf

+0

我理解你的問題,但在Java中不允許修改'List',最簡單的方法是在原始列表中調用'removeAll()'。它可以幫助你。 –

0
元素

大概我對你的問題不太瞭解,但爲什麼你不能通過doSomething這個清單然後用Lambdas操縱它?

事情是這樣的:

public static void main(String[] args) { 
    List<String> l = new ArrayList<>(); 
    l.add("a"); 
    l.add("b"); 
    System.out.println(l.size()); 
    doSomething(l); 
    System.out.println(l.size()); 
} 

private static void doSomething(List<String> l) { 
    l.stream().filter(s -> s.equals("a")).findFirst().map(l::remove); 
} 
0

您應該使用Collection.removeIf(predicate)方法。

根據文檔:

移除此collection滿足給定謂詞的元素。

在您的例子:

first_mas.removeIf(d -> d.equals("1")); 

或者更好:

first_mas.removeIf("1"::equals); 

在你需要做到這一點的方法doSomething(List<String> list)裏面,只是通過原始列表作爲參數的情況。