如何在java中使用对象的唯一id从对象列表中获取特定对象?
我希望通过使用对象列表中对象的唯一id来指定对象及其所有值 我已经试过了,但是在运行下面的代码时,我得到了索引-1如何在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
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,您可以很好地编写它。