2017-03-11 1 views
2
public class ScoreCard { strong text 
    private double[] scores; 
/** 
* @param val 
* @param low 
* @param high 
* @return low if val < low, 
* high if val > high, 
* val if val is between low and high 
*/ 

private double constrain(double val, int low, int high) { 
    if (val < low) 
     return low; 
    if (val > high) 
     return high; 
    else 
     return val; 
    } 

/** 
* DEEP copy m into scores with each item contrained between 0 and 100. 
* use method {@link this#constrain(double, int, int)}. 
* For example, if s = {-15.2, 67.4, 126.8}, scores should become 
* {0, 67.4, 100}, AND scores should be a DEEP copy of s. 
* @param s (assume s is not null) 
*/ 

public void setMarks(double[] s) { 
    for(int i = 0; i < s.length; i++) { 
     if (s[i] < 0 || s[i] > 100) 
      constrain(s[i], 0, 100); 
      this.scores[i] = s[i]; 
    } 
} 

私はこのコードの部分にしばらくお待ちしています。 Javadocの状態として、私は<が0になり、得点が> 100〜100になるように "setMarks"に "constrain"のパラメータを呼び出すのに問題があります。自分のコードがディープコピーを正しく作成しているとは思わない「s」を「スコア」に正しく変換します。メソッドにパラメータを渡してディープコピーを作成する

正しい方向へのプッシュは非常に高く評価されます。

+1

。 –

答えて

1

sの値をscoresに割り当てるのは、constraintsの結果を考慮しないことです。以下のコードはそれを行う必要があります。代替案として

public void setMarks(double[] s) { 
    for(int i = 0; i < s.length; i++) { 
     if (s[i] < 0 || s[i] > 100) 
      this.scores[i] = constrain(s[i], 0, 100); // <- this solves! 
     else 
      this.scores[i] = s[i]; 
    } 
} 

、簡単かつきれい:あなたは)(制約をキャリンしているが、あなたはメソッドが返すという制約値を無視している

private double constrain(double val, int low, int high) { 
    if (val < low) 
     return low; 
    if (val > high) 
     return high; 
    return val; // <- notice here 
} 

public void setMarks(double[] s) { 
    for(int i = 0; i < s.length; i++) { 
      this.scores[i] = constrain(s[i], 0, 100); // <- notice here 
    } 
} 
+0

ifは必要でもありません。これはメソッド自体で行われます。 –

+1

私は今参照してください。だから、私はまず "制約"クラスを通過させずに配列を渡そうとしていたのですか?助けてくれてありがとう – copernicon1543

+0

いいえ、あなたは正しく配列をsetMarksメソッドに渡していましたが、constrainメソッド(クラスではありません)を使ってスコア配列に値を正しく設定していませんでした。 – hmatar

関連する問題