2013-03-08 17 views
5

私は基本的なJavaを今学んでおり、わからないコードに問題があります。それは基本的にタイトルが言っているものです。私のJavaコンパイラは、私のカスタムcompareToメソッドにエラーがあり、intを返す必要があると言っています。問題は、私が知る限り、intを返すことです。まだそれは私に間違いを与えている。誰かが間違っていることを私のコードで指摘してもらえますか?また、私は既にクラスでComparableを実装しています。Javaで修正されたcompareToメソッドは、intを返す必要があると言っていますが、1を返す必要があります。

public int compareTo(Homework other) { 
    if (getDaysLate() < other.getDaysLate()) { 
     return -1; 
    } else if ((dateSubmitted == other.dateSubmitted) 
      && (files.compareTo(other.files) == -1)) { 
     return -1; 
    } else if ((dateSubmitted == other.dateSubmitted) 
      && (files == other.files)) { 
     if (name.compareTo(other.name) == -1) { 
      return -1; 
     } else if (name.compareTo(other.name) == 1) { 
      return 1; 
     } else if (name.compareTo(other.name) == 0) { 
      return 0; 
     } 
    } else { 
     return 0; 
    } 
} 

答えて

1

あなたはこのブランチの後に他の不足している:ここに私の方法だテストが失敗した

else if (name.compareTo(other.name) == 0) { 
    return 0; 
} 

場合(compareTo 0を返さない)メソッドが戻り値なしで終了しなければなりません、これはJavaでは不正です。

また、compareToは、0,1、および-1だけでなく、任意の整数値を返すことができます。

2

第3のelseには何も返さないパスがあります。

else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) { 
    if (name.compareTo(other.name) == -1) { 
     return -1; 
    } 
    else if (name.compareTo(other.name) == 1) { 
     return 1; 
    } 
    else if (name.compareTo(other.name) == 0) { 
     return 0; 
    } else return ... 
} 

dateSubmitted != other.dateSubmitted場合は0を返しているようですので、ところで、私は、私はあなたの実装のロジックを以下てるかはわかりません。 compareToもアンチ対称(つまりsgn(x.compareTo(y)) == -sgn(y.compareTo(x)))である必要がありますが、実装は異なります。

+0

@TedHopp権利(ありがとう、固定)。私はまた、反対称性が結果の​​*記号**(両方ともゼロ、または一方が正、他方が負である)にのみ必要であると訂正しました。絶対値は関係ありません。 – Javier

1

あなたはいつもintを返すことを(どのようなifとelseでも)確認できますか?私にとってはそれほど明白ではないようですが、コンパイラが私と同意していることは間違いありません。

これを解決する方法の1つは、機能の最後にreturn -1; //or whatever valueを追加することです。

1

2番目のelse-ifステートメントには、何も返さないコードパスがあります。あなたは言う:

else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) { 
    if (name.compareTo(other.name) == -1) { 
     return -1; 
    } 
    else if (name.compareTo(other.name) == 1) { 
     return 1; 
    } 
    else if (name.compareTo(other.name) == 0) { 
     return 0; 
    }  

しかし、もしそうでなければ、どうなるでしょうか? 2番目のelse-ifステートメントの最後のelse-ifをelseに変更してみてください。

0

このメソッドは、すべてのコードフローパスで適切な値を返す必要があります。つまり、メソッドが返されるすべての条件に適用されます。次のifブロックでは、マークした1つのパスには戻りません。

else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) { 
     if (name.compareTo(other.name) == -1) { 
     return -1; 
     } 
     else if (name.compareTo(other.name) == 1) { 
     return 1; 
     } 
     else if (name.compareTo(other.name) == 0) { 
     return 0; 
     } 
     // It should return something here, if none of the above "if" statements match. 
     // Or one of the above "else if" should be changed to "else" 
    }