首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何比较文本文件的每一行?java

如何比较文本文件的每一行?java
EN

Stack Overflow用户
提问于 2015-07-12 17:50:29
回答 5查看 6.2K关注 0票数 3

我有一个包含792行内容的文本文件:

代码语言:javascript
运行
复制
der 17788648
und 14355959
die 10939606
Die 10480597

现在我想比较一下“死”和“死”在小写中是否相等。因此,如果lowerCase中的两个字符串相等,则将单词复制到lowerCase中的一个新文本文件中,并对值进行求和。

预期产出:

代码语言:javascript
运行
复制
der 17788648
und 14355959
die 114420203

到目前为止我有这样的看法:

代码语言:javascript
运行
复制
    try {
        BufferedReader bk = null;
        BufferedWriter bw = null;

        bk = new BufferedReader(new FileReader("outagain.txt"));
        bw = new BufferedWriter(new FileWriter("outagain5.txt"));

        List<String> list = new ArrayList<>();
        String s = "";
        while (s != null) {
            s = bk.readLine();
            list.add(s);
        }


        for (int k = 0; k < 793; k++) {
            String u = bk.readLine();
            if (list.contains(u.toLowerCase())) {

                //sum values?

            } else {
                bw.write(u + "\n");
            }
        }

        System.out.println(list.size());

    } catch (Exception e) {
        System.out.println("Exception caught : " + e);
    }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-07-12 18:26:23

使用HashMap跟踪唯一字段。在做put之前,先看看这个值是否已经存在。如果是,则将旧值与新值相加,并再次放入其中(这将替换具有相同键的旧行)。

代码语言:javascript
运行
复制
package com.foundations.framework.concurrency;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;

public class FileSummarizer {

  public static void main(String[] args) {
    HashMap<String, Long> rows = new HashMap<String, Long>();
    String line = "";
    BufferedReader reader = null;
    try {
      reader = new BufferedReader(new FileReader("data.txt"));
      while ((line = reader.readLine()) != null) {
        String[] tokens = line.split(" ");
        String key = tokens[0].toLowerCase();
        Long current = Long.parseLong(tokens[1]);

        Long previous = rows.get(key);
        if(previous != null){
          current += previous;
        }
        rows.put(key, current);
      }
    }
    catch (IOException e) {
      e.printStackTrace();
    }
    finally {
      try {
        reader.close();
        Iterator<String> iterator = rows.keySet().iterator();
        while (iterator.hasNext()) {
          String key = iterator.next().toString();
          String value = rows.get(key).toString();

          System.out.println(key + " " + value);
        }
      }
      catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}
票数 0
EN

Stack Overflow用户

发布于 2015-07-12 18:02:42

不要使用list.add(s);,而是使用list.add(s.toLowerCase());。现在,您的代码正在比较不确定大小写行和小写行。

票数 1
EN

Stack Overflow用户

发布于 2015-07-12 18:27:56

使用Java 8,最好的方法是使用streams api来解决诸如读取文件、比较、分组、收集等标准问题,因为这样做要简洁得多。至少当文件只有几KB时,就不会有问题了。类似于:

代码语言:javascript
运行
复制
Map<String, Integer> nameSumMap = Files.lines(Paths.get("test.txt"))
            .map(x -> x.split(" "))
            .collect(Collectors.groupingBy(x -> x[0].toLowerCase(),
                    Collectors.summingInt(x -> Integer.parseInt(x[1]))
            ));

首先,您可以使用Files.lines()读取文件,后者返回一个Stream<String>,而不是将字符串拆分成一个Stream<String[]>,最后,您可以使用groupingBy()summingInt()函数对数组的第一个元素进行分组,并按第二个元素进行求和。

如果您不想使用流API,也可以在循环中创建一个HashMap并手动进行求和。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31370782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档