2016-08-13 36 views
0

我寫了一個計算賣出貨幣交易過程(ASK)的平均值和標準差的方法,但我認爲這不是定義這種行爲的最簡單方法,所以我需要一個幫助。從解析的XML文件中計算標準偏差

  1. 在我看來有太多的創建Bigdecimal值。

  2. 我也懷疑使用Arraylist獲取值以計算標準偏差,也許這是更好的數據結構來實現該目標。

該方法還包含購買貨幣兌換課程的平均值(BID在解析文件中),但請不要關注它。

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

這個問題可能會更恰當地貼在[代碼審查堆棧交易所網站(HTTP://代碼審查。 stackexchange.com/)。 –

+0

謝謝你,我也在codereview網站發佈 – glinczux

回答

0

你爲什麼要做這麼多的使用BigDecimal的,而不是雙重算術計算的,當你最終回覆到一倍的運算來計算平方根反正這不是我清楚。

這裏是一個XPath 3.1解決方案(這當然可以從Java方便地調用):

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