我有一个名为AuctionItem
. 该类AuctionItem
有一个调用的方法,该方法getName()
返回一个String
. 如果我有一个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;
}
Yes.you have to loop it
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
基本上你需要根据 name查找元素getName
。解决这个问题的两种方法:
1-不要使用ArrayList
,使用HashMap<String,AutionItem>
whereString
将是名称
2-getName
用于生成索引并使用基于索引的添加到数组列表中list.add(int index, E element)
。从名称生成索引的一种方法是使用它的 hashCode 并按ArrayList
当前大小取模(类似于里面使用的东西HashMap
)
.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 (int i = 0; i < list.length; i++) {
if (list.get(i) .getName().equalsIgnoreCase("myName")) {
System.out.println(i);
break;
}
}
To find the item that has a name, should I just use a for loop, and when the item is found, return the element position in the ArrayList?
Yes to the loop (either using indexes or an Iterator
). On the return value, either return its index, or the item iteself, depending on your needs. ArrayList
doesn't have an indexOf
(Object target, Comparator compare)` or similar. Now that Java is getting lambda expressions (in Java 8, ~March 2014), I expect we'll see APIs get methods that accept lambdas for things like this.
您可以实现hashCode
/ equals
of your AuctionItem
,如果它们具有相同的名称,则它们中的两个是相等的。当您这样做时,您可以使用以下方法indexOf
和类似contains
的方法ArrayList
:arrayList.indexOf(new AuctionItem("The name"))
. 或者,当您在 equals 方法中假设传递了 String 时:arrayList.indexOf("The name")
。但这不是最好的设计。
但我也更喜欢使用 aHashMap
将名称映射到项目。
而不是通过列表的强力循环(例如1到10000),而是使用迭代搜索方法:列表需要按要测试的元素排序。
从中间元素 size()/2 例如 5000 开始搜索,如果搜索项大于 5000 处的元素,然后在上(10000)和中点(5000)之间的中点测试元素 - 7500
继续这样做直到你达到比赛(或者一旦你下降到一个较小的范围(例如20个项目)就使用蛮力循环
您可以在大约 13 到 14 个测试中搜索 10000 个列表,而不是可能的 9999 个测试。