计算特定列的总和时出错

时间:2012-02-08 10:08:20

标签: java

我在这里遇到了我的代码中的另一个问题,因为我是java的新手。我的任务是读取包含大约300条记录的文本文件,并且记录有13个字段。我试图计算每个字段的总和,例如,如果年龄是我的第一个字段,它们是所有300个人的年龄的总和,然后将其存储在数组索引中。

import java.io.*;
import java.util.Vector;
public class Mean
{
private static Vector contents;

private static BufferedReader br;
private static FileInputStream inputstream;
private static FileOutputStream outputstream;

public Mean()
{
    contents = new Vector();
}
public void doDuplicationRemoval(String filename)
{
    try{
        inputstream = new FileInputStream(filename);
        br = new BufferedReader(new InputStreamReader(inputstream));
        String string = "";
        while((string = br.readLine())!= null)
        {
            String[] split = string.split(",");
            Vector vector = new Vector();
            for(int i=0; i<split.length; i++)
                vector.add(split[i].trim());
            if(!vector.contains("?"))
    {
        contents.add(split);
    }


    }
    }
    catch(Exception err){
        System.out.println(err);
    }
}

 public void doDataConv(String filename)
{
    DataConversion.readFile(contents);
    DataConversion.writeFile(filename);
}

  public static void doDataConversion(Vector contents)
{
    DataConversion.readFile(contents);
    for(int i=0; i<contents.size(); i++)
    {
        String string = "";
        String[] split = (String[])contents.get(i);
        split[0] += getAge(split[0]);
        System.out.println(split[0]);
}
}
  private static String getAge(String src)
{
    String age = src;
    return age;
}

public static void main(String [] args) {
    Mean dr;
    dr = new Mean();
    dr.doDuplicationRemoval("input.txt");
    dr.doDataConv("inp_out.txt");
dr.doDataConversion(contents);
}


}

输入为
63个
67个
50

我的目标是让输出为180

但是我得到了 6363
6767
5050

有人可以帮助我解决问题。

4 个答案:

答案 0 :(得分:1)

你不是在添加数字而是连接字符串:

split[0] += getAge(split[0]);

总结值(例如,第一列字段的数字内容)

  1. 定义一个局部变量,例如循环外的int sum = 0;
  2. 解析字符串(Integer.parseInt(split[0]))和
  3. 中的值
  4. 将每个已解析的值添加到sum

答案 1 :(得分:1)

这对我来说是第一个问题:

private static String getAge(String src)
{
    String age = src;
    return age;
}

您将年龄视为字符串。如果您想将其视为数字,则应该对其进行解析(例如使用Integer.parseInt)。

这是第二个问题:

String string = "";
String[] split = (String[])contents.get(i);
split[0] += getAge(split[0]);
System.out.println(split[0]);

这只会改变split [0]的值,当你在下一次迭代中重新分配它时会被覆盖。你需要这样的东西:

int sum = 0;
for(int i=0; i<contents.size(); i++)
{
    String[] split = (String[])contents.get(i);
    sum  += getAge(split[0]); // After changing getAge to return an int
}
System.out.println(sum);

答案 2 :(得分:0)

您的实际错误在这里,因为您使用+添加两个包含整数

的字符串
split[0] += getAge(split[0]);//here split[0] is String 63, getAge(split[0]) 
                     //retuns also String 63 hence addition  gives "63" + "63" = "6363"

进行串联的字符串添加

Integer.parseInt()

所以转换如下:

split[0] = new Integer (Integer.parseInt(split[0]) +
                          Integer.parseInt( getAge(split[0]))).toString()

如果要在整数数组中存储值,则创建另一个整数数组来存储值。

如果要将结果存储在int数组中,请执行以下操作:

int agesum[] = new int[]

agesum[0] += Integer.parseInt( getAge(split[0]));

答案 3 :(得分:0)

问题在于你

split[0] += getAge(split[0]);

由于拆分表的类型是String,它将连接值。您需要一个结果表,例如:

int[] result = new int[];

然后:

result[0] += getAge(split[0]);

我会尽力为您的目的制定一个好的设计:

  • 创建一个具有记录结构的类。我们将其命名为Record
  • 使用您阅读的每一行启动一个记录对象
  • 放入记录表
  • 您可以使用所有总和创建另一个记录
  • 不要使用Vector。如果需要列表,请使用ArrayList(多线程上下文除外)。 Vector只是Java 2之前的遗留类。它已经过时了。