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]; 
    } 
} 

Je suis coincé sur cette partie du code depuis un moment maintenant. Comme les états Javadoc, j'ai du mal à appeler les paramètres de "constrain" à "setMarks" pour définir des scores < 0 à 0 et des scores> 100 à 100. Je ne pense pas non plus que mon code crée correctement une copie profonde de "s" en "scores" correctement.Passer des paramètres à une méthode et créer une copie en profondeur

Toute poussée dans la bonne direction serait grandement appréciée.

+1

Vous callin Contraindre(), mais vous ne tenez pas compte de la valeur contrainte que la méthode retourne. –

Répondre

1

Le problème est que vous attribuez simplement des valeurs de s à scores sans tenir compte des résultats de constraints. Le code ci-dessous devrait le faire.

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]; 
    } 
} 

Comme alternative, plus simple et plus propre:

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

Le si n'est même pas nécessaire. C'est fait par la méthode elle-même. –

+1

Je vois maintenant. Donc j'essayais de passer le tableau sans passer correctement par la classe "constrain" en premier? Merci pour l'aide – copernicon1543

+0

Non, vous passiez correctement le tableau à la méthode setMarks mais vous ne définissiez pas correctement les valeurs du tableau de scores en utilisant la méthode constrain (ce n'est pas une classe). – hmatar