我试图使用.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:我得到了它的工作。现在我可以搜索特定的firstName并将其打印出来。编辑目标:我真正想要的是搜索例如" 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;
}
答案 0 :(得分:1)
使用contains()
无法解决问题。该方法搜索列表中的对象,而您需要根据列表中对象的属性进行搜索。
您当前的代码看起来是正确的。
关于您最近的修改:
我的目标是能够键入例如“Peter”,然后查找包含“Peter”的所有对象。
在这种情况下,您需要非常相似的代码。只需循环,直到找到具有该属性的对象:
public User findByName(String name) {
for (User u : list) {
if (u.getName().equals(name)) {
return u;
}
}
return null;
}
答案 1 :(得分:0)
包含方法检查对象是否存在于集合中。这基本上意味着确定被检查的对象是否等于到集合中的任何对象。
为了建立这种相等性,使用了对象的equals方法。
在这种情况下,您需要在用户对象中覆盖equals方法,以便在ID相同时说明2个用户对象相等。
之后,您可以直接使用contains进行检查。
注意:不要忘记覆盖哈希码方法。
答案 2 :(得分:0)
根据列表的大小以及执行此代码的频率,您尝试的自定义迭代直到找到匹配方法可能没问题,但如果需要频繁查找,如果这些方法你可能想尝试一个:
不是列表,而是将客户ID的HashMap创建为Key,将相应的User对象创建为值。无论提供的用户ID位于列表顶部还是底部,此方法都应该为您提供接近响应时间。
您还可以将Collections.sort与自定义比较器一起使用,比较用户对象的ID以对列表进行排序,然后再使用Collections.binarySearch进行搜索,再次使用仅查看用户ID的比较器。作为输入,您只需创建一个新的User对象,并将其ID设置为您要搜索的对象。
答案 3 :(得分:-1)
考虑重写哈希码和您的Person类的等号以识别您的对象。
另请参阅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,则可以生成它。