0

我正在尝试使用 .contains() 搜索我的 arrylist。

这是我在窗口类中的方法:

    public void findByID() {
    int customer = Integer.parseInt(findCustomerField.getText());

    if (userA.list.contains(customer)) {
        User user = userA.findById(customer);
        output.setText(user.toString());
    }
}

在我以前的版本中,我使用 customerID 来查找客户,我的 UserArchive 类中的 findByID 方法如下所示:

    public User findById(int id) {
    for (User u : list) {
        if (u.getCustomerID() == id) {
            return u;
        }
    }
    return null; // or empty User
}

如果我想使用 .contains(),最后一个方法应该如何?我认为窗口类方法还可以,不确定。我对使用 contains 感到毫无头绪(昨天才听说)。

编辑:我不想再使用 customerID 来查找对象(这就是以前的版本所做的) 我的目标是能够键入例如“Peter”,然后找到包含“Peter”的所有对象。根据我的理解,这可以通过以某种方式使用 .contains() 来实现。

编辑2:我让它工作。现在我可以搜索特定的名字并将其打印出来。编辑目标:我真正想要的是搜索例如“Pe”,然后获取列表中包含“Pe”的每个对象,而不仅仅是名字。将调查 Akshay Singhal 发布的内容。以下是适用于 firstName 的方法:

窗口类:

    public void findByID() {
    String customer = findCustomerField.getText();

    if (!customer.equals("")) {
        User user = userA.findByName(customer);
        output.setText(user.toString());
    }
    else
        JOptionPane.showMessageDialog(this, "Does not exist");
}

用户存档类:

    public User findByName(String name) {
    for (User u : list) {
        if (u.getFirstName().equals(name)) {
            return u;
        }
    }
    return null;
}
4

4 回答 4

1

您无法使用contains(). 该方法在列表中搜索对象,而您需要根据列表中对象的属性进行搜索。

您当前的代码看起来是正确的。


关于您最近的编辑:

我的目标是能够输入例如“Peter”,然后找到所有包含“Peter”的对象。

在这种情况下,您需要非常相似的代码。只需循环,直到找到具有该属性的对象:

public User findByName(String name) {
    for (User u : list) {
        if (u.getName().equals(name)) {
            return u;
        }
    }
    return null;
}
于 2013-04-19T10:05:59.773 回答
0

根据列表的大小和执行此代码的频率,您尝试的 custom-iterate-till-you-find-a-match 方法可能没问题,但如果需要频繁查找,您可能需要尝试以下方法之一:

  1. 创建一个客户 ID 作为 Key 并将相应的 User 对象作为值的 HashMap 而不是一个列表。无论提供的用户 ID 位于列表顶部还是底部,此方法都应为您提供接近响应时间。

  2. 您还可以将 Collections.sort 与自定义比较器一起使用,该比较器比较用户对象的 id 以对列表进行排序,然后使用 Collections.binarySearch 进行搜索,再次使用仅查看用户 id 的比较器。作为输入,您可以创建一个新的 User 对象并将其 Id 设置为您正在搜索的对象。

于 2013-04-19T10:47:07.530 回答
0

contains 方法检查集合中是否存在对象。这基本上意味着确定被检查的对象是否等于集合中的任何对象。

为了建立这种相等性,使用对象的 equals 方法。

在这种情况下,您需要覆盖用户对象中的 equals 方法,以说明当 ID 相同时 2 个用户对象相等。

之后,您可以直接使用 contains 进行检查。

注意:不要忘记覆盖哈希码方法。

于 2013-04-19T10:07:00.280 回答
-1

考虑覆盖您的 Person-class 的 hashcode 和 equals 来识别您的对象。

另请查看http://docs.oracle.com/javase/6/docs/api/java/util/List.html#contains%28java.lang.Object%29

要使用它,您应该以如下方式覆盖 User 的 equals() 和 hashCode() 方法:

public boolean equals(Object o){

.... some standard stuff like is Null and instanceof

return this.getCustomerID() == ((User) o).getCustomerID();

}

如果你使用 eclipse 你可以生成它。

于 2013-04-19T10:10:37.630 回答