Java 未找到条件时如何返回null?
当我的方法找不到它要找的内容时,我试图得到一个返回null。该方法正在查找截止日期之前的最新提交(参数)。如果在参数日期之前没有提交,有人可以帮助我如何获取此信息。谢谢Java 未找到条件时如何返回null?,java,linked-list,Java,Linked List,当我的方法找不到它要找的内容时,我试图得到一个返回null。该方法正在查找截止日期之前的最新提交(参数)。如果在参数日期之前没有提交,有人可以帮助我如何获取此信息。谢谢 // students is a LinkedList @Override public Submission getSubmissionBefore(String unikey, Date deadline) { // TODO Implement this, ideally in b
// students is a LinkedList
@Override
public Submission getSubmissionBefore(String unikey, Date deadline) {
// TODO Implement this, ideally in better than O(n)
if (unikey == null || deadline == null) {
throw new IllegalArgumentException("Unikey or deadline was null");
}
Date tempDate = null;
int k = -1;
for (int i = 0; i < this.students.size(); i++) {
if (students.get(i).getUnikey().equals(unikey)) {
if (tempDate == null) {
tempDate = students.get(i).getTime();
k = i;
} else if (students.get(i).getTime().before(deadline) && students.get(i).getTime().after(tempDate)) {
k = i;
}
}
}
return students.get(k);
}
//学生是一个链接列表
@凌驾
公开提交getSubmissionBefore(字符串unikey,日期截止日期){
//TODO实现这一点,理想情况下采用优于O(n)的方式
if(unikey==null | | deadline==null){
抛出新的IllegalArgumentException(“Unikey或deadline为空”);
}
Date tempDate=null;
int k=-1;
for(int i=0;i
公开提交getSubmissionBefore(字符串unikey,日期截止日期){
//TODO实现这一点,理想情况下采用优于O(n)的方式
if(unikey==null | | deadline==null){
抛出新的IllegalArgumentException(“Unikey或deadline为空”);
}
提交sub=null;
Date tempDate=null;
for(int i=0;i
您可以通过添加控件来实现
@Override
public Submission getSubmissionBefore(String unikey, Date deadline) {
// TODO Implement this, ideally in better than O(n)
if (unikey == null || deadline == null) {
throw new IllegalArgumentException("Unikey or deadline was null");
}
Date tempDate = null;
int k = -1;
for (int i = 0; i < this.students.size(); i++) {
if (students.get(i).getUnikey().equals(unikey)) {
if (tempDate == null) {
tempDate = students.get(i).getTime();
k = i;
} else if (students.get(i).getTime().before(deadline) && students.get(i).getTime().after(tempDate)) {
k = i;
}
}
}
if(k!=-1)
return students.get(k);
else
return null;
}
@覆盖
公开提交getSubmissionBefore(字符串unikey,日期截止日期){
//TODO实现这一点,理想情况下采用优于O(n)的方式
if(unikey==null | | deadline==null){
抛出新的IllegalArgumentException(“Unikey或deadline为空”);
}
Date tempDate=null;
int k=-1;
for(int i=0;i
您还可以使用流(当然,如果您使用的是Java8
),以功能性的方式解决问题
publicstaticsubmissiongetsubmissionbefore(字符串unikey,日期截止日期){
if(unikey==null | | deadline==null){
抛出新的IllegalArgumentException(“Unikey或deadline为空”);
}
可选any=students.stream()
.filter(submission->submission.getUniKey().equals(unikey)和&submission.getTime().before(截止日期))
.max(Comparator.comparing(Submission::getTime));
返回any.orElse(空);
}
您的代码有几个问题:
- 如果
条件错误,您的第一个;即使在截止日期之后,它也会将任何提交与匹配的unikey
匹配
您的第二个else if
也是错误的,因为您设置了k
,但没有设置tempDate
在返回之前
,您应该检查k
是否仍然是-1
,例如使用三元返回k==-1?null:students.get(k)
;然而:
您可以使用for-each循环直接迭代提交,而不是迭代索引,从而使整个代码更加紧凑
通过存储结果本身,您既不需要k
也不需要tempDate
,也不需要检查索引最后是否仍然是-1
使用上述建议,您可以将循环简化为:
Submission res = null;
for (Submission sub : this.students) {
if (sub.getUnikey().equals(unikey)) {
if (sub.getTime().before(deadline) &&
(res == null || sub.getTime().after(res.getTime()))) {
res = sub;
}
}
}
return res;
或者使用Java 8流,以更紧凑的形式:
return this.students.stream() // iterate all students
.filter(s -> s.getUnikey().equals(unikey)) // get entries with matching key
.filter(s -> s.getTime().before(deadline)) // get entries before deadline
.max(Comparator.comparing(s -> s.getTime())) // from those, get the latest one
.orElse(null); // or null if none exists
您可以将当前日期与if语句进行比较并返回null
Date current = new Date();
if(current.before(deadline))
return null;
else{ for (int i = 0; i < this.students.size(); i++) {
if (students.get(i).getUnikey().equals(unikey)) {
if (tempDate == null) {
tempDate = students.get(i).getTime();
k = i;
} else if (students.get(i).getTime().before(deadline) && students.get(i).getTime().after(tempDate)) {
k = i;
}
}
}
return students.get(k);
}
当前日期=新日期();
如果(当前,在(截止日期)之前)
返回null;
else{for(inti=0;i
不要使用=
来比较字符串。您正在这里执行此操作:students.get(i).getUnikey()==unikey
。改用equals()
。请参阅:您的案例中缺少tempDate=…
,如果是的话。现在您不需要i
,您可以通过使用for each循环来简化此过程。而且,tempDate
仅在其中一种情况下更新;最好将这两个条件组合成一个if
块。
return this.students.stream() // iterate all students
.filter(s -> s.getUnikey().equals(unikey)) // get entries with matching key
.filter(s -> s.getTime().before(deadline)) // get entries before deadline
.max(Comparator.comparing(s -> s.getTime())) // from those, get the latest one
.orElse(null); // or null if none exists
Date current = new Date();
if(current.before(deadline))
return null;
else{ for (int i = 0; i < this.students.size(); i++) {
if (students.get(i).getUnikey().equals(unikey)) {
if (tempDate == null) {
tempDate = students.get(i).getTime();
k = i;
} else if (students.get(i).getTime().before(deadline) && students.get(i).getTime().after(tempDate)) {
k = i;
}
}
}
return students.get(k);
}