获取数组列表中项目的索引;
Posted
技术标签:
【中文标题】获取数组列表中项目的索引;【英文标题】:Getting Index of an item in an arraylist; 【发布时间】:2013-04-29 21:52:04 【问题描述】:我有一个名为AuctionItem
的类。 AuctionItem
类有一个名为 getName()
的方法,它返回一个 String
。如果我有一个AuctionItem
类型的ArrayList
,那么返回ArrayList
中具有特定名称的项目的索引的最佳方法是什么?
我知道有一个.indexOf()
函数。这个函数的参数是一个对象。要查找具有名称的项目,我是否应该只使用 for 循环,当找到该项目时,返回 ArrayList
中的元素位置?
有没有更好的方法?
【问题讨论】:
【参考方案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 个测试。
【讨论】:
以上是关于获取数组列表中项目的索引;的主要内容,如果未能解决你的问题,请参考以下文章