1

how to get a specific java object from java.util.List<Object> using equals method exemple :

  Class Person{
       String name;
       int age;
       //...

       @Override
       public boolean equals(String str) {
            return (this.name.equals(str.name));
       }
    }

main{
   List<Person> list = personDao.findAll();

   if(list.contain("joe")){
      // how to get the Person named joe ????
   }
}

MySQL Select AND OR

I'm not having success with my query statement and I think it has to do with the way I'm executing it.

$query5 = "select * from ".$db_prefix."customer_det where (fname = '".$fname."' and lname = '".$lname."') or phone = '".$phone."'";

Essentially I want to select all from customer_det when the first and last name match the posted first and last name. If there's no posted first and last name, then I want it to select all where the posted phone number matches. My three variables $fname, $lname, and $phone are all set to read from the previous form $_POST['fname']; etc...

Is this the right logic to be using?

4

6 回答 6

3

如果您想获得对列表中特定人员的引用:

Person foo = null;
for (Person p : list) {
    if (p.getName().equals("joe")) {
        foo = p;
        break;
    }
}
// now foo is your person (if he exists) or null (if he doesnt exist);

这只会找到第一个名为 joe 的人。

于 2012-11-06T17:15:31.533 回答
2

您的 Person.equals() 方法的签名不正确...参数类型应始终为“对象”,如下所示:

@Override
public boolean equals(Object obj) {
    return (obj instanceof Person) && ((Person) obj).name.equals(this.name);
}

然后 jlordoless 使用 list.contains(new Person("name") 的建议将起作用。

于 2012-11-06T17:18:49.130 回答
2

简单地迭代。接口上没有List从列表中返回对象的方法。

Person joe = null;
List<Person> persons = personDao.findAll();
for (Person thisPerson : persons) {
  if ("joe".equals(thisPerson.getName())) {
     joe = thisPerson;
     break;
  }
}

这将设置Person joe为名为 joe的第一个人。如果您要查找集合中的最后一个,请删除该break语句。

于 2012-11-06T17:21:07.003 回答
1

我认为你在这里有一个设计缺陷。如果有 2 个 joe-s 会发生什么?

如果您没有重复的名称,您可以为以下名称创建一个 getter Person

public String getName() {
    return name;
}

之后你可以这样做:

Person joe = null;
for(Person person : list) {
    if("joe".equals(person.getName()) {
        joe = person;
        break;
    }
}

这样可以避免创建不必要的Person.

于 2012-11-06T17:20:37.660 回答
1

你不应该这样使用equals。覆盖equals有些复杂,hashcode例如,您也必须覆盖。具有最小更改的基于列表的解决方案:

Class Person{
   String name;
   int age;
   //...

   public String getName() {
        return name;
   }
}

main {
   List<Person> list = personDao.findAll();

   Person foundPerson = null;
   for(Person person : list) {
       if (person.getName().equals("joe")) {
           foundPerson = person;
           break;
       }
   }

   if (foundPerson != null) {
       // do something
   }
}

但是,我会考虑使用Map<String, Person>, 名称作为键。在忽略equals年龄的情况下压倒一切听起来不太好,真的。

于 2012-11-06T17:24:42.000 回答
0

@Hyde:无法回答您的答案。当且仅当使用散列时,才需要覆盖“hashCode”。如果人们想使用 HashMap 或 Hashing 相关的其他 API,那么他必须重写 hashCode 和 equals...否则“equals”可以正常工作。

于 2012-11-06T18:13:19.963 回答