我有一个名为itemList
的数组列表,其中包含许多项目。每个项目都是RetailItem类型,包含描述,价格,库存数量和产品代码。我尝试做的是使用indexof
方法在我的数组列表中搜索匹配项,但我遇到了麻烦。也许我一直在思考太难,但自从我开始试图解决这个问题以来已经过了2个小时。
我要在程序中做其他事情,但首先我必须找到匹配的项目 这是我无法弄清楚的代码片段:
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)是这样的:Corn Crisps, 9.45, 35, 61835
当我进入UPC 61835时,indexOf在索引0处找不到它
也许我没有意义,我可能不得不一直试图弄清楚
答案 0 :(得分:0)
如果为RetailItem类创建toString()函数,则可以比较字符串,因为每个Object都有一个字符串表示。您可以选择以与用户输入UPC时所需的方式匹配的方式表示对象。
答案 1 :(得分:0)
这是indexOf的作用:它遍历列表,并测试列表中的每个RetailItem
是否相等(使用equals()
)作为参数传递给indexOf()
的对象。
RetailItem不能等于String。 String不能等于RetailItem。所以这不可行。
所以你需要自己迭代,找到第一个零售项目,其targetUPC
等于用户输入的targetUPC
。
int index = -1;
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getTargetUpc().equals(targetUpc) {
index = i;
break;
}
}
答案 2 :(得分:0)
我认为您正在使用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并且比较两个不同的实例会给出错误。
您应该像在Java的String类中一样使用 interning 。在创建Class的实例时,如果已存在具有相同参数的引用,则应返回预先存在的引用。
我不是这方面的专家,也许您可以在这个主题上找到一些帮助: Good pattern for creating an object that supports interning?
希望这有帮助