2016-08-13 2 views
0

평균 판매 통화 교환 코스 (ASK)와 표준 편차의 평균을 계산하는 방법을 썼지 만 그러한 행동을 정의 할 수있는 가장 쉬운 방법은 아니라고 생각합니다. 도움.구문 분석 된 XML 파일에서 표준 편차를 계산합니다

  1. 제 생각에는 Bigdecimal 값을 너무 많이 생성하고 있습니다.

  2. 또한 표준 편차를 계산하기 위해 값을 얻는 데 Arraylist를 사용하는 것에 의문을 가지고 있습니다. 아마도 그 목표를 달성하는 데 더 나은 데이터 구조 일 수 있습니다.

이 방법에는 구매 통화 교환 코스 (구문 분석 된 파일의 BID)의 평균도 포함되지만 유의하지는 않습니다. 어쨌든 제곱근을 계산하는 연산을 두배로 되 돌리는 끝날 때, 오히려 이중 연산보다 BigDecimal의를 사용하여 계산에 너무 많은 일을 할 이유

package pl.parser.nbp; 

import java.math.BigDecimal; 
import java.math.RoundingMode; 
import java.util.ArrayList; 
import java.util.List; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class Counting { 
public void countAverageAndStandartDeviaton(String address){ 
    try 
    { 
     DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = df.newDocumentBuilder(); 
     Document doc = db.parse(address); 
     doc.getDocumentElement().normalize(); 

     NodeList nList = doc.getElementsByTagName("Rate"); 

     List<BigDecimal> listForStandartDeviation = new ArrayList<>(); 
     BigDecimal averageOfBid = new BigDecimal("0"); 
     BigDecimal averageOfAsk = new BigDecimal("0"); 
     BigDecimal divisor = new BigDecimal(nList.getLength()); 

     for (int temp = 0; temp < nList.getLength(); temp++) { 

      Node nNode = nList.item(temp); 
      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 

       Element eElement = (Element) nNode; 

       BigDecimal valueForBidAverage = new BigDecimal(eElement.getElementsByTagName("Bid").item(0).getTextContent()); 
       BigDecimal valueForStandartDeviation = new BigDecimal(eElement.getElementsByTagName("Ask").item(0).getTextContent()); 
       averageOfBid = averageOfBid.add(valueForBidAverage); 
       averageOfAsk = averageOfAsk.add(valueForStandartDeviation); 
       listForStandartDeviation.add(valueForStandartDeviation); 


      } 
     } 
     averageOfBid = new BigDecimal(averageOfBid.divide(divisor).toString()).setScale(4, RoundingMode.HALF_UP); 
     averageOfAsk = new BigDecimal(averageOfAsk.divide(divisor).toString()); 
     System.out.println(averageOfBid + " - BID Average"); 

     BigDecimal sumStandartDeviation = new BigDecimal("0"); 
     for(int i = 0 ; i<listForStandartDeviation.size(); i++){ 
      BigDecimal valueFromList = new BigDecimal(listForStandartDeviation.get(i).toString()); 
      sumStandartDeviation = sumStandartDeviation.add((valueFromList.subtract(averageOfAsk)).pow(2)); 
     } 
     sumStandartDeviation = sumStandartDeviation.divide(divisor); 
     sumStandartDeviation = new BigDecimal(Math.sqrt(sumStandartDeviation.doubleValue())) 
       .setScale(4, RoundingMode.HALF_UP); 
     System.out.println(sumStandartDeviation + " - ASK Standart Deviation"); 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 
+2

이 질문에 더 적절하게 [코드 검토 스택 Exchange 사이트]에 게시 될 수 있습니다 (HTTP : // 코드 검토

여기에 (물론 자바에서 쉽게 호출 할 수 있습니다)하는 XPath 3.1 솔루션입니다. stackexchange.com/). –

+0

나는 또한 codereview 웹 사이트에 게시 해 주셔서 감사합니다. – glinczux

답변

0

그것은 내게 분명하지 않다.

let $rates := //Rate 
return (avg($rates/Bid), math:sqrt(sum($rates/(Ask*Ask)))) 
관련 문제