从文件中读取数据,将结果写入新文件(java)

时间:2018-03-06 13:10:25

标签: java

我需要读取一些txt文件,从中获取数据,找出平均数,然后将它们写入另一个文件。我已经做了很多事情,但无法在新文件中写入所需的值。

    public static double KronKesk(double a, double b, double c){
        return (a/2+b+c/2)/2;

    } 


     public static double KronKesk2(double[] b){
        int jag = 0;
        double sum = 0;
        for (int i = 0; i < b.length; i++) {
            jag++;
        }
        jag = jag - 1;
        sum = ArraySum(b) - b[0] - b[b.length-1];
        return (b[0]/2 + sum +b[b.length-1]/2)/jag;
     }


    public static double ArraySum(double[] a){
        double sum = 0;
        for (int i = 0; i < a.length; i++) {
            sum = sum+a[i];   
        }
        return sum;
    }

    public static void main(String[] args) {
        try{
            String filePath = "C:\\Users\\user\\Desktop\\TLU\\Semester 2\\ProgPohikursus\\temp";
            BufferedReader br = new BufferedReader(new FileReader(filePath  + ".txt"));
            String rida;

            List<Andmed> andmed = new ArrayList<>();
            int ridaCount = 0;
            while((rida = br.readLine()) != null){
                String[] temp = rida.split(",");
                Andmed andmed0 = new Andmed();
                andmed0.setKuupaev(Double.valueOf(temp[0]));
                andmed0.setTemp0(Double.valueOf(temp[1]));
                andmed0.setTemp6(Double.valueOf(temp[2]));
                andmed0.setTemp12(Double.valueOf(temp[3]));
                andmed0.setTemp18(Double.valueOf(temp[4]));
                andmed0.setTemp24(Double.valueOf(temp[5]));

                andmed.add(andmed0);
                ridaCount++;

            }
            System.out.println(andmed);
            br.close();
            File fout = new File(filePath + "_avgtemp"  + ".txt");
            FileOutputStream fos = new FileOutputStream(fout);
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
            Andmed andmed0 = new Andmed();

            for (int i = 0; i < ridaCount; i++) {

                double[] andmed1 = {andmed0.getTemp0(), andmed0.getTemp6(), andmed0.getTemp12(), andmed0.getTemp18(), andmed0.getTemp24()};
                double[] andmedFaili = {andmed0.getKuupaev(), KronKesk2(andmed1)};
                bw.write(Arrays.toString(andmedFaili) + "\n");
            }
            bw.close();

        } catch(Exception ex){
            ex.printStackTrace();
        }

    }




}

另一个带有getter和setter的文件:

public class Andmed {
    private double k;
    private double t0;
    private double t6;
    private double t12;
    private double t18;
    private double t24;
    /*protected static List<Double> allTemp = new ArrayList<Double>();

    public double tempListi(double t0, double t6, double t12, double t18, double t24){
    allTemp.add(t0);
    allTemp.add(t6);
    allTemp.add(t12);
    allTemp.add(t18);
    allTemp.add(t24);
    return 0;
    }*/

    public void setKuupaev(double k){
        this.k = k;
    }
    public void setTemp0(double t0){
        this.t0 = t0;

    }
    public void setTemp6(double t6){
        this.t6 = t6;

    }
    public void setTemp12(double t12){
        this.t12 = t12;

    }
    public void setTemp18(double t18){
        this.t18 = t18;

    }
    public void setTemp24(double t24){
        this.t24 = t24;

    }

    public double getKuupaev(){
        return k;
    }
    public double getTemp0(){
        return t0;
    }
    public double getTemp6(){
        return t6;
    }
    public double getTemp12(){
        return t12;
    }
    public double getTemp18(){
        return t18;
    }
    public double getTemp24(){
        return t24;
    }
}

我在第一个档案中的内容是:

12.01,3,4,5,6,7,8
13.01,4,5,5,4,3,6
...

我需要进入一个新文件:

12.01,按时间顺序排列的前6个数字

我现在得到的是:

[0.0, 0.0]
[0.0, 0.0]
[0.0, 0.0]

错误在哪里? :/

提前谢谢你!

1 个答案:

答案 0 :(得分:0)

for循环中,您根本没有使用列表,而是在循环之前声明的空andmed0变量。

删除该变量并使用实际列表:

            // Andmed andmed0 = new Andmed(); // no need for that

            for (int i = 0; i < ridaCount; i++) {

                Andmed currentAndmed  = andmed.get(i);
                double[] andmed1 = {currentAndmed.getTemp0(), currentAndmed.getTemp6(), currentAndmed.getTemp12(), currentAndmed.getTemp18(), currentAndmed.getTemp24()};
                double[] andmedFaili = {currentAndmed.getKuupaev(), KronKesk2(andmed1)};
                bw.write(Arrays.toString(andmedFaili) + "\n");
            }

另请注意,您无需使用ridaCount变量来计算列表大小,只需拨打andmed.size()即可。

即:

for (int i = 0; i < andmed.size(); i++)

最后,如@gilfernandes的评论中所述,您可以简单地使用foreach循环:

            for(Andmed currentAndmed : andmed) {

                double[] andmed1 = {currentAndmed.getTemp0(), currentAndmed.getTemp6(), currentAndmed.getTemp12(), currentAndmed.getTemp18(), currentAndmed.getTemp24()};
                double[] andmedFaili = {currentAndmed.getKuupaev(), KronKesk2(andmed1)};
                bw.write(Arrays.toString(andmedFaili) + "\n");
            }