我有一个包含792行内容的文本文件:
der 17788648
und 14355959
die 10939606
Die 10480597现在我想比较一下“死”和“死”在小写中是否相等。因此,如果lowerCase中的两个字符串相等,则将单词复制到lowerCase中的一个新文本文件中,并对值进行求和。
预期产出:
der 17788648
und 14355959
die 114420203到目前为止我有这样的看法:
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);
}发布于 2015-07-12 18:26:23
使用HashMap跟踪唯一字段。在做put之前,先看看这个值是否已经存在。如果是,则将旧值与新值相加,并再次放入其中(这将替换具有相同键的旧行)。
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();
}
}
}
}发布于 2015-07-12 18:02:42
不要使用list.add(s);,而是使用list.add(s.toLowerCase());。现在,您的代码正在比较不确定大小写行和小写行。
发布于 2015-07-12 18:27:56
使用Java 8,最好的方法是使用streams api来解决诸如读取文件、比较、分组、收集等标准问题,因为这样做要简洁得多。至少当文件只有几KB时,就不会有问题了。类似于:
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并手动进行求和。
https://stackoverflow.com/questions/31370782
复制相似问题