我有一个名为AuctionItem
的类。这个AuctionItem
类有一个名为getName()
的方法,返回一个String
类型的值。如果我有一个类型为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;
}
基本上,您需要根据名称 getName
查找 ArrayList
元素。解决此问题的两种方法:
1- 不使用 ArrayList
,而是使用 HashMap<String,AutionItem>
,其中 String
将是名称
2- 使用 getName
生成索引,并使用索引为基础的数组列表添加 list.add(int index, E element)
。从名称生成索引的一种方法是使用其哈希代码并对 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
for (int i = 0; i < list.length; i++) {
if (list.get(i) .getName().equalsIgnoreCase("myName")) {
System.out.println(i);
break;
}
}
你可以实现 AuctionItem
的 hashCode
/equals
方法,使得如果两个对象具有相同的名称,则它们相等。这样做后,你可以使用 ArrayList
的方法 indexOf
和 contains
,例如:arrayList.indexOf(new AuctionItem("The name"))
。或者在 equals 方法中假设传递了一个字符串:arrayList.indexOf("The name")
。但这不是最好的设计。
我建议使用 HashMap
将名称映射到物品。
不要使用暴力循环遍历列表(例如1到10000),而是使用迭代搜索方法: 需要按照要测试的元素对列表进行排序。
从中间元素size()/2处开始搜索,例如5000, 如果搜索项大于5000位置的元素,则测试上限(10000)和中点(5000)之间的中间元素-7500。
一直这样做,直到找到匹配项(或者在范围较小时使用暴力循环遍历,例如20个项目)
您可以在大约13到14个测试中搜索10000项列表,而不是潜在地进行9999个测试。