2014-10-07 71 views
1

這裏可能缺少一些基本的東西,但是從列表中選擇符合某些條件的對象的最佳方法是什麼? 說我們有:從列表中選擇特定的對象用Java

class MyObject { 
    int id; 
    String type; 

    // getters..setters 
} 

我使用它:

List<MyObject> myObjects = new ArrayList<MyObject>(); 
    myObjects = getListOfObjects(); 

現在讓我們說,在myObjects有10個項目,其中3個有type=="bla"。此刻,我只是循環所有對象,並在循環內決定是否需要它,但有沒有更好的方法?

我記得,在C#中我曾經有過類似

myObjects.Where(x => x.type.equals("bla")); 

PS,我指定的Java 7所以沒有拉姆達我呢。

+0

然後你已經做對了。 – 2014-10-07 10:59:33

+1

如果您試圖避免循環遍歷列表並打算總是按類型檢索對象組,請考慮一個'Map >' – 2014-10-07 11:05:01

+0

另一種替代方案可以是番石榴Multimap。在你的情況下,「bla」將是關鍵。 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html – 2014-10-07 11:12:36

回答

0

我不認爲你可以做到這一點,而無需創建某種索引。所以例如有Map<String, Map<String, Set<MyObject>>>你可以撥打電話index.get("type").get("bla")。但是你必須先構建這個結構。如果:a)屬性沒有變化b)您有很多對象。對於10個對象來說,這裏的性能並不重要,我只是簡單地做你現在正在做的事情,並將其隱藏在一些非常方便的方法中。

0

您可以使用LambdaJ library及其Lambda.exists方法與一些自定義Hamcrest匹配。然後,你可以讓你的主代碼如下所示:

if (exists(myObjects, typeIs("bla"))) { /* ... */ } 

...只要你自己創建自定義的匹配方法typeIs。但是如果我只有一個地方只有一個地方只有10件物品,我就不會這樣下去。

這也取決於你的數據:如果你的清單是排序的,你可以do a binary search就可以了。儘管如此,如果列表中有成千上萬的項目,這會更有用。

最後,你可以只使用Collection.containsmyObjects.contains(blaElement),但要求blaElement有這樣一個equals方法,返回「真」的類型相匹配時。