2016-01-11 80 views
1

我想從一個集合中取出一個項目,並根據謂詞保留它。它確實似乎應該是可能的,但我無法找到一種方法來防止兩次通過列表。這種操作可用於基於動態優先級「彈出」對象。什麼是從一組中抽取對象的Java 8方法?

也許我應該堅持一個迭代器。

下面是一個例子:

import org.junit.Test; 

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

public class RemoveAndUse { 

    class A { 
     int x; 
     A(int x) { this.x = x;} 
    } 

    class B { 
     int y; 
     B(int y) { this.y = y;} 
    } 

    @Test 
    public void removeHappyPath() { 
     Set<A> aList = new HashSet<>(Arrays.asList(new A(1), new A(2), new A(3))); 
     B b = new B(2); 

     // remove and keep an A that matches b 
     A found = aList.stream() 
       .filter(a -> a.x == b.y) 
       .findAny().get(); 

     aList.removeIf(a -> a.x == b.y); 
     // or: aList.remove(found); 

     assert(!aList.contains(found)); 
     assert(found.x == b.y); 

    } 
} 

任何其他的想法?

+1

如果你有一個正確的hashcode/equals實現,remove通過'HashSet'獲取常量時間,所以調用'aList.remove(found)'很好。 –

回答

1
A found; 
for (Iterator<A> it = aList.iterator();it.hasNext();) { 
    A a = it.next(); 
    if (a.x == b.y) { 
    found = a; 
    it.remove(); 
    break; 
    } 
} 

O(n)有保證;

+0

另外你應該檢查是否存在這樣的元素。也許A組不包含任何B. –

+0

是的,迭代器的工作原理。但是,我想知道是否有使用lambda功能的解決方案。然後我可以創建一個通用的'流行' –

相關問題