2015-02-25 2 views
0

Ceci est un extrait très simplifiée de mon code que je utilise pour obtenir la valeur la plus basse calculée et ses paramètres à l'aide SortedMap:Ajouter toutes les valeurs à SortedMap (Java)

import java.math.BigDecimal; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.SortedMap; 
import java.util.TreeMap; 
import java.util.Map.Entry; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     getMinValue(); 
    } 

    public static Parameter getMinValue() throws Exception { 

     SortedMap<Double, Parameter> minFromMap = new TreeMap<Double, Parameter>(); 
     List<Double> real = new ArrayList<>(
       Arrays.asList(4.0, 3.0, 3.0, 1.0, 0.0, 2.0, 5.0, 1.0, 0.0, 0.0, 
         1.0, 7.0, 4.0, 1.0, 2.0, 4.0, 0.0)); 
     int k = 2; 
     BigDecimal step = new BigDecimal("0.1"); 

     for (BigDecimal alphaNew = BigDecimal.ZERO; alphaNew 
       .compareTo(BigDecimal.ONE) < 0; alphaNew = alphaNew.add(step)) { 

      for (BigDecimal betaNew = BigDecimal.ZERO; betaNew 
        .compareTo(BigDecimal.ONE) < 0; betaNew = betaNew.add(step)) { 

       for (BigDecimal lambda = BigDecimal.ZERO; lambda 
         .compareTo(BigDecimal.ONE) < 0; lambda = lambda 
         .add(step)) { 

        Parameter param = new Parameter(); 
        param.setAlpha(alphaNew.doubleValue()); 
        param.setBeta(betaNew.doubleValue()); 
        param.setGamma(lambda.doubleValue()); 
        param.setK(k); 

        double sumUp = 0; 
        double value = 0; 

        int observations = 0; 
        for (int i = 0; i < real.size(); i++) { 
         double pow = Math.pow(real.get(i), 2); 
         sumUp += pow; 
         observations++; 
        } 
        value = Math.sqrt(sumUp/observations); 
        param.setValue(value); 
        minFromMap.put(value, param); 
       } 
      } 
     } 

     for (Entry<Double, Parameter> en : minFromMap.entrySet()) { 
      System.out.println("Value: " + en.getKey() + " Alpha: " 
        + en.getValue().getAlpha() + " Beta: " 
        + en.getValue().getBeta() + " Lambda: " 
        + en.getValue().getGamma() + " k: " + en.getValue().getK()); 
     } 

     Parameter param = new Parameter(); 

     param.setAlpha(minFromMap.get(minFromMap.firstKey()).getAlpha()); 
     param.setBeta(minFromMap.get(minFromMap.firstKey()).getBeta()); 
     param.setGamma(minFromMap.get(minFromMap.firstKey()).getGamma()); 
     param.setK(minFromMap.get(minFromMap.firstKey()).getK()); 
     param.setValue(minFromMap.get(minFromMap.firstKey()).getValue()); 

     return param; 
    } 
} 

public class Parameter { 

    private double alpha; 
    private double beta; 
    private double gamma; 
    private int k; 
    private double value; 

    public double getAlpha() { 
     return alpha; 
    } 

    public void setAlpha(double alpha) { 
     this.alpha = alpha; 
    } 

    public double getBeta() { 
     return beta; 
    } 

    public void setBeta(double beta) { 
     this.beta = beta; 
    } 

    public double getGamma() { 
     return gamma; 
    } 

    public void setGamma(double gamma) { 
     this.gamma = gamma; 
    } 

    public int getK() { 
     return k; 
    } 

    public void setK(int k) { 
     this.k = k; 
    } 

    public double getValue() { 
     return value; 
    } 

    public void setValue(double value) { 
     this.value = value; 
    } 
} 

J'utilise SortedMap pour obtenir le plus bas calculé valeur en fonction des paramètres Alpha, Beta et Gamma. (Je sais que ce n'est pas le cas ici, car il est un extrait très simplifié.)

Je voudrais obtenir toutes les valeurs possibles (variables value) stockées en fonction de Alpha, Beta et Gamma dans minFromMap et pour obtenir le paramètres pour lesquels value est la valeur la plus basse. Cependant, la sortie du code affiché est:

Valeur: 2,990180006385608 Alpha: 0.9 Beta: 0,9 Lambda: 0,9 k: 2

Je sais que la valeur ne change pas et c'est pourquoi une seule L'entrée est stockée dans SortedMap mais comme mentionné précédemment: est-il possible de stocker toutes les entrées avec des valeurs et des paramètres et de les trier comme SortedMap? Quelqu'un peut-il m'aider à résoudre ce problème? Merci.

Répondre

0

l'intérieur de vos boucles, vous réinitialiser:

double sumUp = 0; 
double value = 0; 

Et vous calculer ces valeurs sans les différentes valeurs des paramètres. Vous allez vous retrouver avec une seule entrée dans la carte triée. Si vous modifiez la partie de calcul afin d'utiliser les paramètres, vous aurez value différents et plusieurs entrées dans la carte. En dehors de cela, le code est correct et devrait fonctionner: puisque vous utilisez un SortedMap<Double, Parameter>, la carte sera triée sur l'ordre naturel Double, ce qui signifie que le premier élément sera le minimum.

Note: à la fin de la méthode getMinValue(), vous n'avez pas besoin de copier les paramètres dans un nouvel objet, juste retour

return minFromMap.get(minFromMap.firstKey());