【问题标题】:Getting Index of an item in an arraylist;获取数组列表中项目的索引;
【发布时间】:2013-04-29 21:52:04
【问题描述】:
我有一个名为AuctionItem 的类。 AuctionItem 类有一个名为 getName() 的方法,它返回一个 String。如果我有一个AuctionItem 类型的ArrayList,那么返回ArrayList 中具有特定名称的项目的索引的最佳方法是什么?
我知道有一个.indexOf() 函数。这个函数的参数是一个对象。要查找具有名称的项目,我是否应该只使用 for 循环,当找到该项目时,返回 ArrayList 中的元素位置?
有没有更好的方法?
【问题讨论】:
标签:
java
arraylist
find
element
indexof
【解决方案1】:
我认为 for 循环应该是一个有效的解决方案:
public int getIndexByname(String pName)
{
for(AuctionItem _item : *yourArray*)
{
if(_item.getName().equals(pName))
return *yourarray*.indexOf(_item)
}
return -1;
}
【解决方案2】:
是的。你必须循环播放它
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;
}
【解决方案3】:
基本上您需要根据名称getName 查找ArrayList 元素。解决这个问题的两种方法:
1- 不要使用ArrayList,使用HashMap<String,AutionItem>,其中String 是名称
2- 使用getName 生成索引并使用基于索引的添加到数组列表list.add(int index, E element)。从名称生成索引的一种方法是使用它的 hashCode 和 ArrayList 当前大小取模(类似于 HashMap 内部使用的东西)
【解决方案4】:
.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。
【解决方案5】:
for (int i = 0; i < list.length; i++) {
if (list.get(i) .getName().equalsIgnoreCase("myName")) {
System.out.println(i);
break;
}
}
【解决方案6】:
要找到有名字的项目,我是不是应该只使用for循环,找到项目后,返回ArrayList中的元素位置?
是的循环(使用索引或Iterator)。在返回值上,根据您的需要返回其索引或项目本身。 ArrayList 没有 indexOf(Object target, Comparator compare)` 或类似的。现在 Java 正在获得 lambda 表达式(在 Java 8 中,~2014 年 3 月),我希望我们会看到 API 获得接受 lambda 的方法来处理此类事情。
【解决方案7】:
您可以实现您的AuctionItem 的hashCode/equals,这样如果它们具有相同的名称,它们中的两个就相等。当您这样做时,您可以使用ArrayList 的indexOf 和contains 方法,如下所示:arrayList.indexOf(new AuctionItem("The name"))。或者当您在 equals 方法中假设传递了一个字符串时:arrayList.indexOf("The name")。但这不是最好的设计。
但我也更喜欢使用 HashMap 将名称映射到项目。
【解决方案8】:
而不是通过列表进行暴力循环(例如 1 到 10000),而是使用迭代搜索方法:
List 需要按要测试的元素进行排序。
从中间元素 size()/2 开始搜索,例如 5000
如果搜索项大于 5000 处的元素,则在上(10000)和中点(5000)之间的中点测试元素 - 7500
一直这样做,直到你达到匹配(或者一旦你下降到更小的范围(例如 20 个项目)就使用蛮力循环遍历
您可以在大约 13 到 14 个测试中搜索 10000 个列表,而不是可能的 9999 个测试。