Список объектов и сравнение значений строк - PullRequest
0 голосов
/ 05 октября 2010

Я ожидаю, что следующее вернет true.

   public class HudsonJob {

     private String name;
     private String status;
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public String getStatus() {
      return status;
     }
     public void setStatus(String status) {
      this.status = status;
     }

     public boolean equals(Object jobName) {
      return name.toLowerCase().equals(((String)jobName).toLowerCase());
     }

     public int hashCode() {
      return name.hashCode();
     }
    }

,

List<HudsonJob> existingJbsLst = hudsonUtil.getAllJobs(); // returns multiple HudsonJob objects in the list.

Утверждение, которое я ожидаю вернуть true:

boolean isExistingJob = existingJbsLst.contains("AnExistingJOB"); всегда возвращает ложь.

OR boolean isExistingJob = existingJbsLst.equals("AnExistingJOB"); также возвращает false.

Что я должен добавить / изменить в коде, чтобы получить ожидаемое возвращаемое значение.

Ответы [ 4 ]

4 голосов
/ 05 октября 2010

Вы тормозите контракт для equals метода.Например:
Симметрично: для любых ненулевых ссылочных значений x и y x.equals (y) должен возвращать true, если и только если y.equals (x) возвращает true.
И в вашем случае job.equals(string) может быть истинным, но string.equals(job) всегда будет ложным.

И что, вероятно, происходит в вашем списке, это то, что элементы сравниваются другим способом:

for (Object el : list) {
    if (parameter.equals(el)) {
        ...
    }
}

Это техническая причина, по которой он не работает: "AnExistingJOB".equals(jobObject) всегда ложно.

edit
Кстати, ваш метод hashCode также неверен.Если при сравнении в методе equals вы игнорируете регистр, игнорируйте его и в hashCode. Bozho совет, вероятно, хороший: IDE будет генерировать эти методы лучше.Кроме того, вы можете проверить ответ Andreas_D для правильной реализации.

2 голосов
/ 05 октября 2010

Второе выражение действительно должно возвращать false, потому что вы сравниваете List со String.Если первое выражение возвращает ложь, то, очевидно, такой работы нет в списке.Реализация равенства равна (ОК, вы должны проверить на 'null' и на те же классы)

Пока пишете о пропущенном тесте - равенство не реализовано правильно, оно не должно приниматьимя задания, но объект HudsonJob:

public boolean equals(Object obj) {
  if (obj == null) return false;
  if (!(obj instanceof HudsonJob)) return false;
  HudsonJob that = (HudsonJob) obj;
  return this.name.equals(that.name);
}
2 голосов
/ 05 октября 2010
  • Вы должны передать объект HudsonJob (не String) методу contains(..).Например (если вы добавите конструктор с именем в качестве параметра):

    boolean exists = existingJbsLst.contains(new HudsonJob("AnExistingJOB"));
    
  • Пусть ваша IDE сгенерирует методы equals и hashCode - она ​​добавит правильные null чеки, проверки типов и т. д.

  • Вы нарушаете договор equals. См. Здесь
  • использование string.equalsIgnoreCase(..)
1 голос
/ 05 октября 2010

Оператор «Содержит» просматривает все метры набора и сравнивает значение «хочу» со значением «найдено».Я говорю это очень осторожно.Если вы говорите «joblist.contains (wantjob)», это дает - чтобы исключить некоторую сложность, соответствующую часть:

for (HudsonJob gotjob : joblist)
{
  if (wantjob.equals(gotjob))
    return true;
}

То есть сравнение - «objectIAmLookingFor.equals (objectInList)»,НЕ "objectInList.equals (objectIAmLookingFor)".

Так что, когда вы ищите в списке HudsonJob's строку, он использует функцию String.equals, а НЕ функцию HudsonJob.equals.А String.equals ничего не знает о HudsonJobs, поэтому он быстро возвращает false.

Есть два способа сделать то, что вы хотите.

Один из способов - изменить функцию HudsonJob.equals на

public boolean equals(Object o)
{
  if (o==null || !(o instanceof HudsonJob))
    return false;
  return this.name.toLowerCase().equals(((HudsonJob)o).name.toLowerCase());
}

Затем написать

HudsonJob wantjob=new HudsonJob();
wantjob.setName("AnExistingJob");
if (existingJobList.contains(wantjob))
  ... whatever ...

Другой способ состоит в том, чтобы не использовать «содержащий», а вместо этого писатьваша собственная функция поиска, например:

public boolean jobInList(List<HudsonJob> existingJobs, String wantJob)
{
  for (HudsonJob gotjob : existingJobs)
  {
    if (gotjob.name.toLowerCase().equals(wantJob.toLowerCase())
      return true;
  }
  return false;
}

(На самом деле, если вам нужен toLowerCase, было бы лучше сделать wantJob.toLowerCase перед циклом, но что угодно.)

Тогда вы можетескажем

if (jobInList(existingJobs,"AnExistingJob"))
... do something ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...