我有一个名为itemList的数组列表,其中包含许多项。每件商品都是RetailItem类型,包含一个描述、价格、库存数量和一个产品代码。我尝试做的是使用indexof方法在数组列表中搜索匹配的项,但遇到了问题。也许我想得太多了,但从我开始尝试解决这个问题到现在已经两个小时了。
我将在程序中做其他事情,但首先我必须找到匹配的项目,这是我无法理解的代码片段:
System.out.println("Enter UPC for an item you want, enter -1 when done");
boolean found = false;
do {
System.out.print("\nEnter a UPC ");
targetUPC = keyboard.nextLine();
RetailItem temporary = new RetailItem("Default", 0, 0, targetUPC);
System.out.println(targetUPC);
int retval = itemList.indexOf(targetUPC);
System.out.println("It's at index " + retval);编辑: indexOf总是返回-1。例如,itemList中的第一项(这是RetailItems的arrayList )是这样的:玉米Crisps,9.45,35,61835。
当我进入UPC 61835时,indexOf在索引0处找不到它
也许我说不通,我可能得一直想办法弄明白
发布于 2014-11-14 03:06:44
如果为RetailItem类创建toString()函数,则可以比较字符串,因为每个对象都有一个字符串表示。您可以选择以与用户进入UPC时要查找的对象相匹配的方式来表示对象。
发布于 2014-11-14 03:09:17
indexOf的作用是:遍历列表,并测试列表中的每个RetailItem是否与作为参数传递给indexOf()的对象相等(使用equals())。
RetailItem不能等于字符串。字符串不能等于RetailItem。所以这不可能行得通。
因此,您需要自己迭代,以找到其targetUPC等于用户输入的targetUPC的第一个RetailItem。
int index = -1;
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getTargetUpc().equals(targetUpc) {
index = i;
break;
}
}发布于 2014-11-14 03:11:13
我假设您使用的是ArrayList。
在indexOf实现中:
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}如您所见,indexOf使用equals,比较两个不同的实例会得到一个false。
您应该像在Java的String类中一样使用interning。当创建Class的实例时,如果具有相同参数的引用已经存在,它应该返回一个预先存在的引用。
我不是这方面的专家,也许你可以在这个话题上找到一些帮助:Good pattern for creating an object that supports interning?
希望这能有所帮助
https://stackoverflow.com/questions/26916175
复制相似问题