AuctionItem
というクラスがあります。 AuctionItem
クラスには、String
を返すgetName()
というメソッドがあります。 ArrayList
型のAuctionItem
がある場合、特定の名前を持つArrayList
内のアイテムのインデックスを返す最良の方法は何ですか?
.indexOf()
関数があることを知っています。この関数のパラメーターはオブジェクトです。名前を持つアイテムを見つけるには、forループを使用するだけで、アイテムが見つかったら、ArrayList
の要素の位置を返しますか?
もっと良い方法はありますか?
Forループは有効なソリューションであると思います。
public int getIndexByname(String pName)
{
for(AuctionItem _item : *yourArray*)
{
if(_item.getName().equals(pName))
return *yourarray*.indexOf(_item)
}
return -1;
}
はい、ループする必要があります
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;
}
基本的に、名前ArrayList
に基づいてgetName
要素を検索する必要があります。この問題に対する2つのアプローチ:
1- ArrayList
を使用せず、String
が名前になる_HashMap<String,AutionItem>
_を使用します
2- getName
を使用してインデックスを生成し、インデックスベースの配列リストlist.add(int index, E element)
への追加を使用します。名前からインデックスを生成する1つの方法は、そのhashCodeを使用し、ArrayList
現在のサイズ(HashMap
内で使用されるものに類似したもの)によるモジュロを使用することです。
for (int i = 0; i < list.length; i++) {
if (list.get(i) .getName().equalsIgnoreCase("myName")) {
System.out.println(i);
break;
}
}
.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を返します。
名前を持つアイテムを見つけるには、forループを使用する必要があります。アイテムが見つかったら、ArrayListの要素の位置を返しますか?
ループにはい(インデックスまたはIterator
を使用)。戻り値では、必要に応じて、インデックスまたはアイテム自体を返します。 ArrayList
にはindexOf
(Object target、 Comparator compare) `などはありません。 Javaはラムダ式を取得しています(Java 8、2014年3月))、APIが以下のようなラムダを受け入れるメソッドを取得することを期待していますこの。
リストをブルートフォースループ(1〜10000など)するのではなく、反復検索アプローチを使用します。リストは、テストする要素でソートする必要があります。
中央の要素size()/ 2で検索を開始します。たとえば、5000の要素よりも大きい検索項目の場合は、upper(10000)とmidpoint(5000)の中間点で要素をテストします-7500
マッチに到達するまでこれを続けます(または、より小さな範囲(20アイテムなど)に到達したら、ブルートフォースループを使用します)
潜在的に9999のテストではなく、約13〜14のテストで10000のリストを検索できます。
hashCode
のequals
/AuctionItem
を実装して、同じ名前の場合に2つが等しくなるようにすることができます。これを行うとき、indexOf
のメソッドcontains
およびArrayList
を次のように使用できます:arrayList.indexOf(new AuctionItem("The name"))
。または、equalsメソッドでStringが渡されると想定する場合:arrayList.indexOf("The name")
。しかし、それは最良の設計ではありません。
しかし、HashMap
を使用して名前をアイテムにマップすることも好みます。