2015-02-25 4 views
0

Это очень упрощенный отрывок из моего кода я использую, чтобы получить самую низкую вычисленное значение и его параметров с помощью SortedMap:Добавить все значения 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; 
    } 
} 

Я использую SortedMap, чтобы получить самый низкий вычислен значение в зависимости от параметров Alpha, Beta и Gamma. (Я знаю, что это не тот случай, потому что это очень упрощен отрывок.)

Я хотел бы получить всех возможных значения (переменная value), хранящихся в зависимости от Alpha, Beta и Gamma в minFromMap и получить параметры, для которых value - самое низкое значение. Тем не менее, выход публикуемого кода:

Значение: +2,990180006385608 Alpha: 0,9 Beta: 0,9 Лямбда: 0,9 к: 2

Я знаю, что значение не изменяется, и поэтому только один запись сохраняется в SortedMap, но как только что было упомянуто: существует ли возможность хранить все записи со значениями и параметрами и сортировать их как SortedMap? Может ли кто-нибудь помочь мне решить эту проблему? Благодарю.

ответ

0

Внутри вашей петли, вы переинициализация:

double sumUp = 0; 
double value = 0; 

И вы вычислить эти значения без различных значений параметров. В отсортированной карте вы получите только одну запись. Если вы измените вычислительную часть, чтобы использовать параметры, то у вас будут разные value и несколько записей на карте.

Кроме этого, код в порядке и должен работать: поскольку вы используете SortedMap<Double, Parameter>, карта будет сортироваться по естественному порядку Double, это означает, что первый элемент должен быть минимальным.

Примечание: в конце метода getMinValue(), вам не нужно копировать параметры нового объекта, просто вернуть

return minFromMap.get(minFromMap.firstKey()); 
Смежные вопросы