[英]Finding an item in an ArrayList in Java?
在C#中,在ArrayList中查找具有特定屬性的項非常簡單:
mSelectedBoard = mBoardConnections.FirstOrDefault(bcd => bcd.Id == id);
這是我發現在Java中做同樣的事情最簡單的方法(希望我能負擔得起Android的MonoTouch):
for ( BoardConnectionData bcd : mBoardConnections ) {
if (bcd.getID() == id) {
mSelectedBoard = bcd;
break;
}
}
我是否錯過了一種更簡單的方法?
謝謝!
在Java 8中,您可以這樣做:
mSelectedBoard = mBoardConnections
.stream().filter(bcd -> bcd.Id == id).findFirst().orElse(null);
如果您需要匹配一個屬性,並且列表中的多個項目可以具有相同的值,那么您就需要像遍歷一樣遍歷。 Java有一個Collections
實用程序類,其中包含許多靜態方法。 您可能需要定義自己的collections實用程序方法來處理此類情況。
通常,如果您不想找到一個元素,只需使用indexOf並確保正確實現equals
。
由於Java中沒有閉包,因此沒有真正更簡單的方法。 當然,您可以使用番石榴,但是恕我直言,它為許多復雜性僅提供了一點簡潔性(例如,最后,因為番石榴非常酷)
假設BoardConnectionData
類根據ID正確覆蓋equals
方法,則以下內容應告訴您對象是否在列表中:
mBoardConnections.contains(object);
如果您從Comparable
繼承來測試id成員並使用SortedSet :
BoardConnectionData brd =
sortedSet.tailSet(new BoardConnectionData(searchedId)).first();
在復雜度方面並不是更有效,但是代碼更短。 :)
繼續討論Dave Newton的答案。 該Collection
是一個ArrayList
,因此在BoardConnectionData
上使用適當的equals
(加上hashCode
)實現, indexOf
方法將允許該表達式
selectedBoard = boardConnections.getAt(boardConnections.indexOf(new BoardConnectionData(id)))
當然,構造探查對象而不是僅從id創建完整的實例可能更可取。
您真的應該問自己, 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) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.