【问题标题】:Search thru arrayList using .contains()使用 .contains() 通过 arrayList 搜索
【发布时间】:2013-04-19 09:57:38
【问题描述】:

我正在尝试使用 .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");
}

UserArchive 类:

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

【问题讨论】:

  • 您的列表是整数列表(客户 ID)还是用户对象列表(客户)?
  • 它是一个用户对象列表。最后一种方法是我在以前的版本中使用的方法。

标签: java arraylist contains


【解决方案1】:

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

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


关于您最近的编辑:

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

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

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

【讨论】:

  • 从技术上讲这是可能的(具有给定 id 的新用户,并且在 id 平等方面是相等的),但我同意你的回答
  • @szegedi 是的,我想这可能有效。但我会考虑滥用equals 的目的。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 当前代码无权访问User 对象。 OP 试图解决的问题 从 ID 解析 User 对象。这个解决方案没有帮助。
  • OP 已经解决了这个问题。我认为,至少对我来说,这个问题似乎更多地是关于在这种情况下如何应用包含。这个答案清楚地说明了应用包含需要做什么。这取决于 OP 在他/她的情况下是否可行。
【解决方案3】:

根据列表的大小和执行此代码的频率,您尝试的自定义迭代直到您找到匹配方法可能没问题,但如果需要频繁查找,如果有以下方法,您可能想尝试一种:

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

  2. 1234563作为输入,您可以创建一个新的 User 对象并将其 Id 设置为您正在搜索的对象。

【讨论】:

    【解决方案4】:

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

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

    要使用它,你应该像这样覆盖 User 的 equals() 和 hashCode() 方法:

    公共布尔等于(对象o){

    ....一些标准的东西,比如 Null 和 instanceof

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

    }

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

    【讨论】:

    • 当前代码无权访问User 对象。 OP 试图解决的问题 从 ID 解析 User 对象。这个解决方案没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2015-09-02
    • 2013-04-13
    • 2015-05-01
    相关资源
    最近更新 更多