簡體   English   中英

在Java中的ArrayList中找到項目?

[英]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;
    }
}

我是否錯過了一種更簡單的方法?

謝謝!

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

有許多實用程序庫包含使用各種“是嗎?”的實現。 實現。 番石榴下議院收藏等)

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

無論如何,顯示的代碼段不應存在於主線代碼中,而應將其抽象為自己的方法,而不管其最終存在於何處。

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM