Простой цикл итератора дает неожиданный результат - PullRequest
1 голос
/ 03 мая 2009

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

private void crossCorr(ArrayList<String> codes, HashMap<String, Stock> stockMap){

    // iterate through the codes list and get all the cross correlations:

    Iterator<String> itr1 = codes.iterator();
    while(itr1.hasNext()){
        String code1 = itr1.next();
System.out.println("  -----  " +code1);
        Iterator<String> itr2 = codes.iterator();
        ArrayList<Double> corrs = new ArrayList<Double>();
        HashMap<String, Double> codeCorr = new HashMap<String, Double>();
        String code2="";
        double corr=-2;
        while(itr2.hasNext()){
            code2 = itr2.next();
            Maths calcs = new Maths();      
            corr = calcs.getCorrelation(stockMap.get(code1).getRorHistory(), stockMap.get(code2).getRorHistory());
            corrs.add(corr);    // we order this list and then use this ordered list
                                // to find the codes for the stocks with the highest
                                // correlation for any given stock
            codeCorr.put(code2, corr);
            System.out.println(code1+" - "+code2+" - Correlation is "+corr);
        }
        orderCorrs(6, codeCorr, corrs, code1);
    }

}

Вывод, который я получаю -

----- GOOG
GOOG - GOOG - соотношение составляет 1,0000000000000002
GOOG - YHOO - Соотношение 0,6986623807707519
GOOG - MSFT - соотношение составляет 0,7275411317567286
GOOG - CSCO - соотношение 0,8122979333663799
GOOG - AAPL - соотношение 0,8217785260604609
GOOG - ADBE - соотношение 0,6102679356472099
GOOG - DISH - соотношение 0,644852624453125
GOOG - NSOL - соотношение составляет 0,11600387177879072
GOOG - SBUX - соотношение 0,6694306410719489
GOOG - PSFT - соотношение составляет -0,09921822861087544
GOOG - XOM - соотношение 0,6728272039489009
GOOG - WMT - соотношение составляет 0,4004364090315347
GOOG - IBM - корреляция 0,7559988282095168
GOOG - JPM - соотношение 0,7085525367336528
GOOG - DNA - корреляция 0,13628949379947575
GOOG - HPQ - Соотношение 0,7819350018750656
GOOG - KO - соотношение составляет 0,5700932682157461
GOOG - VZ - соотношение 0,737881573641585
GOOG - INTC - соотношение 0,7654127298771953
GOOG - SPY - соотношение 0,8042488406758052
GOOG - PEP - соотношение составляет 0,6297924741882344
GOOG - WFC - соотношение составляет 0,5064491351161948
GOOG - ABT - соотношение составляет 0,238752389446595
GOOG - QCOM - соотношение 0,726356709262025
GOOG - COP - Соотношение 0.570604981251932
GOOG - MCD - соотношение составляет 0,5434872575410538

Но я никогда не получаю

YHOO - GOOG - корреляция есть .... и т. Д. И т. Д.

Я уверен, что это простая ошибка, и по какой-то причине я ее не поднимаю.

Я знаю, что дважды выполняю расчеты корреляции, я исправлю это, как только получу эту часть, работающую по назначению.

Пожалуйста, дайте мне знать, если мне нужно предоставить больше информации.

1 Ответ

3 голосов
/ 03 мая 2009

Быстрое тестовое приложение, удалив ссылки на код, о котором мы не знаем, прекрасно работает для меня.

Возможно ли, что что-то генерирует непроверенное исключение, которое вы не обрабатываете? Если бы вы могли опубликовать короткую, но завершенную программу, демонстрирующую проблему, это очень помогло бы. Возьмите копию вашего полного проекта и просто удаляйте биты (например, жестко кодируемые данные и возвращаемые значения), пока вы не сможете убрать что-либо еще, пока проблема не исчезнет. В этот момент вы, конечно, вполне могли найти проблему для себя.

Кстати, если вы используете Java 1.5 или выше, проще использовать расширенный цикл for, чем явно использовать итератор. Вы бы сделали:

for (String code1 : codes) {
    // ...
    for (String code2 : codes) {
        // ...
    }
}
...