2011-12-03 51 views
2

在C#中,發現在具有一定特性的ArrayList的一個項目,它很容易:在Java中查找ArrayList中的項目?

mSelectedBoard = mBoardConnections.FirstOrDefault(bcd => bcd.Id == id); 

這是我發現做同樣在Java中(希望我能買得起的MonoTouch爲Android最簡單):

for (BoardConnectionData bcd : mBoardConnections) { 
    if (bcd.getID() == id) { 
     mSelectedBoard = bcd; 
     break; 
    } 
} 

我錯過了一個更簡單的方法來做到這一點?

謝謝!

回答

1

定義有意義的 equals並使用 Collection.contains

有很多實用程序庫包含使用各種「我是否?」的實現。實現。 (Guava,Commons Collections等)

另一種選擇是創建一個類型化集合,其中包含通過任意條件查找元素的實用程序方法。

無論如何,所顯示的代碼片段不應該存在於主線代碼中,它應該被抽象爲它自己的方法,而不管它最終生存在何處。

+0

包含返回一個布爾值,海報的代碼返回給定ID ... – solendil

+0

@solendil哦項權利。 –

+1

當你重載'equals()'的時候,一定要重寫'hashCode()',否則如果你決定使用例如[1],你可能會遇到[麻煩] [1]。一個'HashSet'作爲存儲之後。 [1]:http://www.xyzws.com/javafaq/why-always-override-hashcode-if-overriding-equals/20 –

0

如果您需要匹配單個屬性,並且列表中的多個項目可以具有該屬性的相同值,那麼您需要像循環一樣循環。 Java有一大堆靜態方法的Collections實用工具類;您可能有義務定義您自己的集合實用程序方法來處理這種情況。

一般來說,如果你不想找到一個元素,只需使用indexOf,並確保正確實施equals

0

由於在Java中沒有關閉,所以沒有真正簡單的方法來做到這一點。當然,你可以用番石榴,但恕我直言,它只能提供一點簡潔了很多複雜的(對於你的榜樣,在最後,因爲番石榴是相當冷靜,否則)

0

假設BoardConnectionData類正確覆蓋基於equals方法上的ID,下面應該告訴你,如果對象是在列表或不:

mBoardConnections.contains(object); 
0

如果從Comparable繼承來測試ID構件和使用SortedSet

BoardConnectionData brd = 
sortedSet.tailSet(new BoardConnectionData(searchedId)).first(); 

複雜性不是更高效,但代碼更短。 :)

0

要堆在戴夫牛頓的答案。所述CollectionArrayList,所以與BoardConnectionData適當equals(加hashCode)實現中,indexOf方法將允許表達

selectedBoard = boardConnections.getAt(boardConnections.indexOf(new BoardConnectionData(id))) 

當然,很可能優選將構造一個探測對象而不是創建一個全從唯一的ID吹的實例。

0

如果ArrayList是正確的數據結構,那麼你應該問自己。給定類似的任務,我會選擇一個Map。 C#和Java都需要O(N)來搜索數組。使用地圖是O(1)。如果這是你經常需要的東西,那麼我會建議正確的結構。

真的,C#和Java版本之間的唯一區別就是一個更短,並使用閉包。正如很多其他人所建議的,您可以對一些現有的庫執行相同的操作。實際上沒有人顯示任何代碼。隨着番石榴,你可以這樣做:

Iterables.find(new Predicate<Data>(){ 
public boolean apply(Data d){ 
return d.id == someId; 
)}, list); 

或者,如果你想有一個默認值,你可以使用.find(predicate, list, defaultValue)

+0

我很確定我不想要地圖,雖然它可以完成這項工作。我在幾種情況下遍歷列表 - 它是在主/從列表視圖的主端顯示的數據。對於大多數情況下,當我需要一個對象時,我已經從listview中項目的.tag中獲得它。在編寫代碼將我的Fragment從已保存狀態恢復時,我只是觸及了這種情況,因爲我只想保存該ID,而不必能夠將整個對象寫入爲可分段。我喜歡使用equals()方法,但是...我想我會這樣做。 – wilbur4321

0

在Java 8,你可以這樣做:

mSelectedBoard = mBoardConnections 
    .stream().filter(bcd -> bcd.Id == id).findFirst().orElse(null);