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 ...