首页 > 解决方案 > 为什么 mean 方法不能正常工作?

问题描述

我有以下imp带有内部类的类ScoringSummaryImplementation,当我mean()单独测试该方法时它可以正常工作,但是当我按照我在主要方法中显示的那样测试它时,答案不正确,我需要知道原因:

public class imp implements Normalizer {
     public static List<BigDecimal> dataToBeNormalized = new ArrayList<>();

    @Override
    public ScoringSummary zscore(Path csvPath, Path destPath, String colToStandardize) {

        ScoringSummary scoringObejct = new ScoringSummaryImplementation();
        if (!Files.exists(csvPath)) {
            throw new IllegalArgumentException("source file not found");
        }

        try {
            readDataToBeNormalized(csvPath, destPath, colToStandardize);
        } catch (IOException ex) {
            Logger.getLogger(imp.class.getName()).log(Level.SEVERE, null, ex);
        } catch (CsvValidationException ex) {
            Logger.getLogger(imp.class.getName()).log(Level.SEVERE, null, ex);
        }

        //Z-score
        for (int i = 0; i < dataToBeNormalized.size(); i++) {
            BigDecimal sub = (dataToBeNormalized.get(i).subtract(scoringObejct.mean()));
            try {
                BigDecimal divide = sub.divide(scoringObejct.standardDeviation(), 2, RoundingMode.HALF_EVEN);
                dataToBeNormalized.set(i, divide);
            } catch (ArithmeticException e) {

            }

        }

        return scoringObejct;
    }

    

    private void readDataToBeNormalized(Path csvPath, Path destPath, String colToStandardize) throws FileNotFoundException, IOException, CsvValidationException {
        int indexOfTheCol = -1;

        CSVReader reader = new CSVReader(new FileReader(csvPath.toString()));
        String[] header = reader.readNext();
        for (int i = 0; i < header.length; i++) {
            if (header[i].equalsIgnoreCase(colToStandardize)) {
                indexOfTheCol = i;
            }
        }
        if (indexOfTheCol == -1) {
            throw new IllegalArgumentException("column " + colToStandardize + " not found");
        }
        String[] values;
        while ((values = reader.readNext()) != null) {
            dataToBeNormalized.add(new BigDecimal(values[indexOfTheCol]));

        }

    }

    //Inner class to implement ScoringSummary
    public static class ScoringSummaryImplementation implements ScoringSummary {
        
    
        @Override
        public BigDecimal mean() {
             BigDecimal sum = new BigDecimal("0");
            BigDecimal sizeOfTheList = new BigDecimal(dataToBeNormalized.size());
            for (int i = 0; i < dataToBeNormalized.size(); i++) {
                sum = sum.add(dataToBeNormalized.get(i));
            }

         sum.divide(sizeOfTheList, 2, RoundingMode.HALF_EVEN);
           
           return sum.divide(sizeOfTheList, 2, RoundingMode.HALF_EVEN);
        }

    }
    
}

// 主要测试:

public class Test {
    public static void main(String [] args){
        Path p = Paths.get("C:\\Users\\DELL\\Documents\\GitHub\\J2EE\\demo\\src\\main\\java\\com\\mycompany\\demo\\d.csv");
        Path p2 = Paths.get("C:\\Users\\DELL\\Documents\\GitHub\\J2EE\\demo\\src\\main\\java\\com\\mycompany\\demo\\des.csv");
        
    Normalizer n1 = new imp ();
   
    ScoringSummary n2 = n1.zscore(p, p2, "age");
    
    
        BigDecimal mean = n2.mean();
        System.out.println(mean);
    }
    
}

这是输出:

0.82

这是年龄列:

|年龄 |

|5434| |42423| |54534| |3333|

标签: javastaticinner-classes

解决方案


推荐阅读