我如何使用indexOf?

时间:2014-11-13 18:45:58

标签: java

我有一个名为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处找不到它

也许我没有意义,我可能不得不一直试图弄清楚

3 个答案:

答案 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?

希望这有帮助