Java 未找到条件时如何返回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

当我的方法找不到它要找的内容时,我试图得到一个返回null。该方法正在查找截止日期之前的最新提交(参数)。如果在参数日期之前没有提交,有人可以帮助我如何获取此信息。谢谢

    // 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); 
                       }