2017-09-21 30 views
0

我創建了一個模型發現指數

public class Portfolio { 

    private String id; 
    private String name; 

    public Portfolio() { 

    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

我有這個模型的列表。我想找到一個特定項目的位置。
我試圖

Portfolio p = new Portfolio(); 
p.setId("1"); 
p.setName("Test"); 
int i = PortfolioList.indexOf(p); 

當我登錄的 「」 返回 「-1」 的值。但我確定「p」對象可用於arraylist。
我不想使用()循環。如果我們的數組列表中有很多對象,我認爲找到一個對象需要時間。

什麼是使用方法indexOf()方法?

+0

你是如何創建'PortfolioList'?這在回答這個問題上可能很有用。 –

回答

1

當然p對象不在列表中。在列表上運行indexOf將嘗試根據參考找到對象。所以如果參考文獻不存在,您將無法找到該對象。

爲什麼要避開for循環? indexOffor循環都將是O(n)。

只需編寫一個for循環來根據id比較列表中的每個值。這是去這裏最好的方式。

1

問題是您的類Portfolio未覆蓋java.lang.Object的equals()方法。因此,當indexOf()正在搜索一個元素時,它將使用Object中的equals()實現,它只是檢查兩個對象是否實際上是同一個實例。你可以看到更多關於以下資源:

https://javaranch.com/journal/2002/10/equalhash.html

既然你剛剛創建的對象p在您的代碼段,它不會是被存儲在ArrayList中的同一個實例,因此它會總是返回未找到。

解決此問題的方法是在Portfolio類中創建您自己的equals()實現。但是,你不需要自己去做這個乏味的工作。相反,我強烈建議您使用AutoValue註釋:

https://github.com/google/auto/blob/master/value/userguide/index.md

AutoValue實際上會降低你的當前Portfolio類,併爲您的equals()hashCode()是免費的。看看上面的鏈接,這可以幫助你一堆。