【问题标题】:Java - How do I add up values in a file?Java - 如何将文件中的值相加?
【发布时间】:2014-12-15 16:38:47
【问题描述】:

我有一个 * 分隔的文件,其中包含按天计算的日志文件。

我需要使用这些数据创建一个“总体计数”文件,但我无法完全弄清楚。

我的文件布局如下:

01/11/2014*0123*0*3*0*1
01/11/2014*4567*1*1*2*4
02/11/2014*0123*1*2*1*0
02/11/2014*4567*5*3*2*1

这只是一个示例。但是,逻辑将是相同的......我需要将这些值相加并获得如下输出:

0123*1*5*1*1
4567*6*4*4*5

我目前正在使用 BufferedReader 逐行遍历文件:

while((strLine = br.readLine()) != null) ...

在包含每日数据的文件中,我感兴趣的代码 (0123, 4567) 始终位于相同的位置,因此我可以将它们作为子字符串:

String code = strLine.subString(11, 15);

或在 *: 上拆分行

String[] line = strLine.split("\\*");
String code = line[1];

但这就是我卡住的地方...我需要通过文件查找“代码”并将其添加到计数中,实现此目的的最佳方法是什么?我尝试使用 2D 数组,但无法完全理解它。

【问题讨论】:

  • 您只是想将第一个 * 之后的所有值相加,例如 0123、4567,还是想以某种方式保存它们以供以后处理?
  • 0123、4567 是在整个文件中将被视为“键”的代码。
  • 一把钥匙干什么用的?你能具体说明你的问题吗? “我需要将值相加”是什么意思?
  • 澄清一下,您是否计算了这两个特定代码的每个唯一实例?
  • 使用Map,其中键是String“0123”或“4567”等。值是大小为4的一维int数组。当您阅读时该文件,如果您的键已经在地图中,则将每个值添加到数组中。如果您的密钥不存在,请创建一个新密钥并初始化一个新值。

标签: java file multidimensional-array


【解决方案1】:
Map<String, int[]> map = new HashMap<String, int[]>();

迭代文件时:

if (map.containsKey(key)) {
    int[] arr = map.get(key);
    //add values to array here
} else {
    int[] newValues = parsedValues;//can use String.split('*'); here from the substring of the line
    map.put(new String(key), newValues);
}

【讨论】:

    【解决方案2】:

    我想我找到了一个可行的解决方案。它可能不是最优雅的,如果可以改进,请随时告诉我。

    public int[][] total(String fileName) {
        int[][] counts = null;
    
        try {
            BufferedReader br = new BufferedReader(new FileReader(fileName));
            String strLine;
            Set<String> codeSet = new HashSet<String>();
            while((strLine = br.readLine()) != null) {
                codeSet.add(strLine.substring(11, 15));
            }
            String[] codes = codeSet.toArray(new String[codeSet.size()]);
            Arrays.sort(codes);
            counts = new int[codes.length][4];
            br = new BufferedReader(new FileReader(fileName));
            while((strLine = br.readLine()) != null) {
            String[] line = strLine.split("\\*");
            for(int i = 0; i < codes.length; i++) {
                if(codes[i].equals(line[1])) {
                    for(int x = 0; x < 4; x++) {
                        counts[i][x] += Integer.parseInt(line[(x + 3)]);
                    }
                }
            }
        }
            br.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    return counts;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-13
      • 2017-02-22
      • 1970-01-01
      • 2012-09-01
      • 2021-05-13
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      相关资源
      最近更新 更多