如何在java中使用对象的唯一id从对象列表中获取特定对象?

如何在java中使用对象的唯一id从对象列表中获取特定对象?,java,collections,Java,Collections,我希望通过使用对象列表中对象的唯一id来指定对象及其所有值 我已经试过了,但是在运行下面的代码时,我得到了索引-1 List<JobDataDetail> jobList = getJobList(); JobDataDetail object = jobList.get(jobList.indexOf(new JobDataDetail(jobReferenceId))); List jobList=getJobList(); JobDataDetail对象=jobList.ge

我希望通过使用对象列表中对象的唯一id来指定对象及其所有值

我已经试过了,但是在运行下面的代码时,我得到了索引-1

List<JobDataDetail> jobList = getJobList();
JobDataDetail object = jobList.get(jobList.indexOf(new JobDataDetail(jobReferenceId)));
List jobList=getJobList();
JobDataDetail对象=jobList.get(jobList.indexOf(newJobDataDetail(jobReferenceId));
从班上

public class JobDataDetail implements Serializable,Comparable<JobDataDetail> {

    public int jobSequence;
    public String jobReferenceId;
    public String jobAddress;
    public String jobScheduledDate;

    public JobDataDetail() {
        super();
        // TODO Auto-generated constructor stub
    }

    public JobDataDetail(int jobSequence){
        super();
        this.jobSequence = jobSequence ;
    }
    public JobDataDetail(String jobReferenceId){
        super();
        this.jobReferenceId = jobReferenceId;
    }

    public int getJobSequence() {
        return jobSequence;
    }
    public void setJobSequence(int jobSequence) {
        this.jobSequence = jobSequence;
    }
    public String getJobReferenceId() {
        return jobReferenceId;
    }
    public void setJobReferenceId(String jobReferenceId) {
        this.jobReferenceId = jobReferenceId;
    }
    public String getJobAddress() {
        return jobAddress;
    }
    public void setJobAddress(String jobAddress) {
        this.jobAddress = jobAddress;
    }
    public String getJobScheduledDate() {
        return jobScheduledDate;
    }
    public void setJobScheduledDate(String jobScheduledDate) {
        this.jobScheduledDate = jobScheduledDate;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((jobReferenceId == null) ? 0 : jobReferenceId.hashCode());
        result = prime * result + jobSequence;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        JobDataDetail other = (JobDataDetail) obj;
        if (jobReferenceId == null) {
            if (other.jobReferenceId != null)
                return false;
        } else if (!jobReferenceId.equals(other.jobReferenceId))
            return false;
        if (jobSequence != other.jobSequence)
            return false;
        return true;
    }

    @Override
    public int compareTo(JobDataDetail another) {
        return this.getJobReferenceId().compareTo(another.getJobReferenceId());
    }

}
公共类JobDataDetail实现了可序列化、可比较的{
公共服务序列;
公共字符串jobReferenceId;
公共字符串地址;
公共字符串jobScheduledDate;
PublicJobDataDetail(){
超级();
//TODO自动生成的构造函数存根
}
public JobDataDetail(int jobSequence){
超级();
this.jobSequence=jobSequence;
}
public JobDataDetail(字符串jobReferenceId){
超级();
this.jobReferenceId=jobReferenceId;
}
public int getJobSequence(){
返回作业序列;
}
public void setJobSequence(int jobSequence){
this.jobSequence=jobSequence;
}
公共字符串getJobReferenceId(){
返回jobReferenceId;
}
public void setJobReferenceId(字符串jobReferenceId){
this.jobReferenceId=jobReferenceId;
}
公共字符串getJobAddress(){
返回工作地址;
}
public void setJobAddress(字符串jobAddress){
this.jobAddress=作业地址;
}
公共字符串getJobScheduledDate(){
返回jobScheduledDate;
}
public void setJobScheduledDate(字符串jobScheduledDate){
this.jobScheduledDate=jobScheduledDate;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
结果=素数*结果
+((jobReferenceId==null)?0:jobReferenceId.hashCode());
结果=素数*结果+作业顺序;
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
JobDataDetail other=(JobDataDetail)obj;
if(jobReferenceId==null){
if(other.jobReferenceId!=null)
返回false;
}else如果(!jobReferenceId.equals(other.jobReferenceId))
返回false;
if(jobSequence!=其他.jobSequence)
返回false;
返回true;
}
@凌驾
公共整数比较(JobDataDetail另一个){
返回这个.getJobReferenceId().compareTo(另一个.getJobReferenceId());
}
}

我已从equals方法中删除了作业序列条件检查,它正在工作。

列表。indexOf()
使用
equals()
方法比较对象

在本例中,假设两个具有相同
jobReferenceId
的对象相等,但
equals()
方法没有这样说(因为方法末尾的
jobSequence
测试)


如果您想通过列表中的某个属性从列表中获取项目,最简单的方法是使用Java 8中的筛选器表达式:

JobDataDetail job = jobList.stream()
                           .filter(j -> j.getAttribute().equals(someValue))
                           .findFirst();

如果Java 8不是一个选项,我会选择经典的
for
循环遍历列表。

但是在equals和hashcode方法中也使用jobSequence,所以它们必须是相同的too@reto-嗨,谢谢你这么快的回答。我得到了解决方案。是的,但在这种情况下,我希望有时使用“jobReferenceId”来创建对象,有时使用“jobSequence”,并且数据jobReferenceId和jobSequence都是不同的。那样的话我能做什么?不知道你想要什么。您希望能够通过对象的
jobReferenceId
或其
jobSequence
检索对象,但不知道其中一个?您的Java版本是什么?有了Java8Lambdas,您可以很好地编写它。