web-dev-qa-db-ja.com

配列リスト内のアイテムのインデックスを取得。

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

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

もっと良い方法はありますか?

18
user2351151

Forループは有効なソリューションであると思います。

    public int getIndexByname(String pName)
    {
        for(AuctionItem _item : *yourArray*)
        {
            if(_item.getName().equals(pName))
                return *yourarray*.indexOf(_item)
        }
        return -1;
    }
17
Kooki

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

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;
}
15
Suresh Atta

基本的に、名前ArrayListに基づいてgetName要素を検索する必要があります。この問題に対する2つのアプローチ:

1- ArrayListを使用せず、Stringが名前になる_HashMap<String,AutionItem>_を使用します

2- getNameを使用してインデックスを生成し、インデックスベースの配列リストlist.add(int index, E element)への追加を使用します。名前からインデックスを生成する1つの方法は、そのhashCodeを使用し、ArrayList現在のサイズ(HashMap内で使用されるものに類似したもの)によるモジュロを使用することです。

7
harsh
for (int i = 0; i < list.length; i++) {
   if (list.get(i) .getName().equalsIgnoreCase("myName")) {
    System.out.println(i);
    break;
  }
}
3
Deepak

.indexOf()はうまく機能します。ここに例が必要な場合は、次のとおりです。

  ArrayList<String> example = new ArrayList<String>();
  example.add("AB");
  example.add("CD");
  example.add("EF");
  example.add("GH");
  example.add("IJ");
  example.add("KL");
  example.add("MN");

  System.out.println("Index of 'AB': "+example.indexOf("AB"));
  System.out.println("Index of 'KL': "+example.indexOf("KL"));
  System.out.println("Index of 'AA': "+example.indexOf("AA"));
  System.out.println("Index of 'EF': "+example.indexOf("EF"));

の出力が得られます

Index of 'AB': 0
Index of 'KL': 5
Index of 'AA': -1
Index of 'EF': 2

注:指定された要素がリストに存在しない場合、このメソッドは-1を返します。

2
Ritwik Gupta

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

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

0
T.J. Crowder

リストをブルートフォースループ(1〜10000など)するのではなく、反復検索アプローチを使用します。リストは、テストする要素でソートする必要があります。

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

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

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

0
Moosee

hashCodeequals/AuctionItemを実装して、同じ名前の場合に2つが等しくなるようにすることができます。これを行うとき、indexOfのメソッドcontainsおよびArrayListを次のように使用できます:arrayList.indexOf(new AuctionItem("The name"))。または、equalsメソッドでStringが渡されると想定する場合:arrayList.indexOf("The name")。しかし、それは最良の設計ではありません。

しかし、HashMapを使用して名前をアイテムにマップすることも好みます。

0
Kai