20

というクラスがありAuctionItemます。AuctionItemクラスには、 を返すというメソッドがありgetName()ますStringArrayListの型がある場合、特定の名前を持つAuctionItem項目のインデックスを返す最良の方法は何ですか?ArrayList

機能があることを知りました.indexOf()。この関数のパラメーターはオブジェクトです。名前を持つアイテムを見つけるには、for ループを使用するだけで、アイテムが見つかったときに要素の位置を返しArrayListますか?

より良い方法はありますか?

4

8 に答える 8

16

はい、ループする必要があります

public int getIndex(String itemName)
{
    for (int i = 0; i < arraylist.size(); i++)
    {
        AuctionItem auction = arraylist.get(i);
        if (itemName.equals(auction.getname()))
        {
            return i;
        }
    } 

    return -1;
}
于 2013-05-06T07:10:28.030 に答える
0

リストを力ずくでループするのではなく (例: 1 から 10000 まで)、反復検索アプローチを使用します。リストは、テストする要素でソートする必要があります。

検索項目が 5000 の要素よりも大きい場合は、中間の要素 size()/2 で検索を開始します (例: 5000)。次に、upper(10000) と midpoint(5000) - 7500 の間の中間点で要素をテストします。

マッチに到達するまでこれを続けます (または、より狭い範囲 (例: 20 アイテム) に到達したら、ブルート フォース ループを使用します)。

潜在的に 9999 回のテストではなく、約 13 ~ 14 回のテストで 10000 のリストを検索できます。

于 2016-04-10T01:51:42.860 に答える
0

hashCode/ equalsof yourを実装AuctionItemして、同じ名前の場合にそれらのうちの 2 つが等しくなるようにすることができます。これを行うと、次のようなメソッドindexOfを使用できます。または、equals メソッドで String が渡されると仮定すると、次のようになります。しかし、それは最高のデザインではありません。containsArrayListarrayList.indexOf(new AuctionItem("The name"))arrayList.indexOf("The name")

ただし、 a を使用しHashMapて名前をアイテムにマップすることもお勧めします。

于 2013-05-06T07:59:33.523 に答える
0

名前を持つアイテムを見つけるには、for ループを使用するだけで、アイテムが見つかったら、ArrayList 内の要素の位置を返す必要がありますか?

ループにはい (インデックスまたは を使用Iterator)。戻り値では、必要に応じて、そのインデックスまたはアイテム自体を返します。(Object target, Comparator compare)` などArrayListはありません。Java がラムダ式を取得するようになったので (Java 8、2014 年 3 月まで)、API がこのようなことのためにラムダを受け入れるメソッドを取得することを期待しています。indexOf

于 2013-05-06T07:10:12.657 に答える