Java 对象列表与字符串值比较

Java 对象列表与字符串值比较,java,hudson,Java,Hudson,我希望下面的返回为真 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

我希望下面的返回为真

   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 existingJbsLst=hudsonUtil.getAllJobs();//返回列表中的多个HudsonJob对象。
我希望返回true的语句是:

boolean isExistingJob=existingJbsLst.contains(“AnExistingJOB”)
总是返回错误

boolean isExistingJob=existingJbsLst.equals(“AnExistingJOB”)也返回false

我应该在代码中添加/更改什么以获得预期的返回值。

  • 您应该将
    HudsonJob
    对象(不是
    String
    )传递给
    contains(…)
    方法。例如(如果添加以名称为参数的构造函数):

  • 让您的IDE生成
    equals
    hashCode
    方法-它将添加适当的
    null
    检查、类型检查等

  • 你违反了
    等于
    的合同
    
  • 使用
    string.equalsIgnoreCase(..)

    • 第二个表达式实际上应该返回false,因为您将列表与字符串进行比较。如果第一个表达式返回false,那么显然列表中没有这样的作业。equals的实现是正确的(好的,您应该测试'null'和相同的类)

      虽然编写缺少的test-equals没有正确实现,但它不应采用作业名称,而应采用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);
      }
      
      您可以使用
      equals
      方法制动。例如:
      它是对称的:对于任何非空参考值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。
      在你的例子中,
      job.equals(string)
      可能是真的,但是
      string.equals(job)
      总是假的

      列表中可能出现的情况是,元素以另一种方式进行比较:

      for (Object el : list) {
          if (parameter.equals(el)) {
              ...
          }
      }
      
      这就是它不起作用的技术原因:
      “AnExistingJOB”。equals(jobObject)
      始终为false

      编辑
      顺便说一句,您的
      hashCode
      方法也是错误的。如果在
      equals
      方法中进行比较时忽略大小写,则在
      hashCode
      中也忽略大小写Bozho的建议可能很好:IDE将更好地生成这些方法。此外,您还可以检查Andreas_D的答案是否有效。

      通过集合的所有成员的“contains”操作符循环,并将“want”值与“found”值进行比较。我说得很仔细。如果您说“joblist.contains(wantjob)”,那么为了省去一些复杂性,将给出相关部分:

      for (HudsonJob gotjob : joblist)
      {
        if (wantjob.equals(gotjob))
          return true;
      }
      
      也就是说,比较是“objectamlookingfor.equals(objectInList)”,而不是“objectInList.equals(objectamlookingfor)”

      因此,当您在HudsonJob列表中搜索字符串时,它使用的是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 ...
      
      另一种方法是不使用“contains”,而是编写自己的搜索函数,如:

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

      您应该添加空检查或默认初始值设定项。。因此,您的代码不会在Null上崩溃这只是一个示例代码,不是完整的代码,请以Objective为例您的示例让人困惑。请明确说明您是如何进行比较的,以及您正在比较的类型。是的,“AnExistingJOB”在我的上下文中是一个hudson作业,表示您不需要进行obj==null检查,因为HudsonJob的null实例总是false。在HudsonJob类中添加toString()返回“this.name”如何。因此,包含列表的方法查找“AnExistingJOB”。equals(hudsonjob)-->hudsonjob的to字符串返回与我在上面检查的内容相同的值,并返回true。在hudsonjob类中添加toString()如何,该类返回“this.name”。因此,包含列表的方法查找“AnExistingJOB”。equals(hudsonjob)-->hudsonjob的to字符串返回与我在上面检查的内容相同的结果,并返回true不幸的是,这不起作用。String.equals不会将该字符串与其他对象的.toString进行比较。它检查另一个对象是否是字符串,如果不是,则返回false。所以String.equals(x),其中x不是字符串,总是返回false,句号,故事结束。
      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;
      }
      
      if (jobInList(existingJobs,"AnExistingJob"))
      ... do something ...