2017-09-21 15 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; 
    } 
} 

を作成しました。私はそれに特定のアイテムの位置を見つけたい。私は "私は" それは "-1" を返すの値を記録するとき
私は

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

を試してみました。しかし、私は確かに "p"オブジェクトはarraylistで利用可能です。
()
ループには を使用しません。私はarraylistに非常に多くのオブジェクトがあれば、オブジェクトを見つけるのに時間がかかると思う。

indexOf()メソッドを使用するのはどのような正しい方法ですか?

+0

どのように?それは質問に答えるのに役立つかもしれません。 –

答えて

1

確かにpオブジェクトがリストに存在しません。 indexOfを実行すると、参照に基づいてオブジェクトが検索されます。したがって、参照が存在しない場合、オブジェクトは見つかりません。

なぜforループを避けたいですか?ループindexOfとループforの両方がO(n)になります。

idに基づくリストの各値を比較するには、forループを書きます。それがここでは最も良い方法です。

1

問題は、クラスPortfolioがjava.lang.Objectのequals()メソッドをオーバーライドしないことです。したがって、indexOf()が要素を検索しているときは、Objectからのequals()の実装を使用します。これは、2つのオブジェクトが実際に同じインスタンスであるかどうかをチェックするだけです。したがって、それは意志、それはArrayListの中に格納されていた同じインスタンスではありません、

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

あなたは自分のコードスニペットでオブジェクトpを作成したことを考える:あなたは、次のリソースにその詳細を見ることができます常に戻りません。

これを修正する方法は、equals()の独自の実装をPortfolioクラスに作成することです。しかし、自分でその面倒な仕事をする必要はありません。代わりに、私は非常にあなたが自動入力値のアノテーションを使用することをお勧めします。

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

自動入力値は、実際にあなたの現在のPortfolioクラスを削減し、自由のためのあなたのためのequals()hashCode()を行います。上記のリンクを見て、これはあなたの束に役立つことができます。

1

この場合、ループの権利を回避しようとしていますか?だから、より良いあなたはハッシュマップを使用することができます。..

はここに参照してください:あなたは `PortfolioList`を作成しているhttps://developer.android.com/reference/java/util/HashMap.html

関連する問題