2017-09-20 8 views
2

私のメソッドが探しているものが見つからない場合は、返り値nullを取得しようとしています。メソッドは、期限(パラメータ)の前に最新の提出物を探しています。パラメータの日付の前に提出がない場合、誰かがこれを得る方法を手伝ってもらえますか?ありがとう!条件が見つからない場合に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); 
    } 
+2

場合にnullを返すことができますが、文字列を比較するために、 '=='使用しないでください。あなたはそれをここでやっている: 'students.get(i).getUnikey()== unikey'。代わりに 'equals()'を使用してください。参照:[Javaの文字列を比較するにはどうすればいいですか](https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – Jesper

+0

あなたは 'tempDate = ...'あなたの 'else if'の場合。 –

答えて

3

あなたのコードを持ついくつかの問題があります。

  • はあなたの最初のif条件は間違っています。それは締め切り
  • 2番目else ifはあなたがkを設定するよう、また間違っているが、returntempDate
  • を設定していない後、それはだ場合でも、あなたはkがまだあるかどうかを確認する必要があり、unikeyが一致する任意の提出を一致します例えば、-1三元を用いてreturn k == -1 ? null : students.get(k);しかし:
  • 代わりにインデックスを反復するの、あなたが直接、結果そのものを格納することにより
  • たくさんよりコンパクトなコード全体を作り、のために、各ループ使用の提出を繰り返すことができ、あなたはどちらktempDateを必要としませんインデックスが最後の助言を超える使用

ではまだ-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 
1
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"); 
    } 

    Submission sub = null; 
    Date tempDate = null; 

    for (int i = 0; i < this.students.size(); i++) { 
     if (unikey.equals(students.get(i).getUnikey())) { 
      if (tempDate == null) { 
       tempDate = students.get(i).getTime(); 
       sub = students.get(i); 
      } else if (students.get(i).getTime().before(deadline) && students.get(i).getTime().after(tempDate)) { 
       sub = students.get(i); 
      } 
     } 
    } 

    return sub; 
} 
+1

'i'は必要ないので、for-eachループを使うことでこれを簡単にすることができます。また、 'tempDate'は、いずれかの場合にのみ更新されます。これらの2つの条件を1つの 'if'ブロックに組み合わせることをお勧めします。 –

1

あなたは(あなたがjava 8を使用している場合はもちろんの)あなたはまた、ストリームで、functionalな方法で問題を解決できるコントロールに

@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; 
     } 
3

を追加することによってそれを行うことができます。

public static Submission getSubmisionBefore(String unikey, Date deadline) { 
    if (unikey == null || deadline == null) { 
     throw new IllegalArgumentException("Unikey or deadline was null"); 
    } 

    Optional<Submission> any = students.stream() 
      .filter(submission -> submission.getUniKey().equals(unikey) && submission.getTime().before(deadline)) 
      .max(Comparator.comparing(Submission::getTime)); 

    return any.orElse(null); 

} 
1

あなたは、現在の日付を比較し、文

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); 
        } 
関連する問題