2015-07-12 57 views
3

我有内容,如文本文件,用792线:如何比较文本文件的每一行? java的

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); 
    } 
+0

那么你的问题是什么? –

+0

@SleimanJneidi我怎样才能让它比较每一行?我的意思是:我想读第一行,并将它与lowerCase中的所有其他行相比较? – lydiaP

回答

0

使用HashMap来跟踪唯一字段。在做投入之前,先做一个看看值是否已经存在的地方。如果是,用新总结的旧值,并把它再次(这将替换具有相同的密钥老线)

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

在Long current = Long.parseLong(tokens [1])处得到错误;'用ArrayOutOfBounds异常..任何想法为什么? – lydiaP

+0

你的分裂isn; t正在工作......检查你的文件,确保第二个标记总是一个数字......文件中没有空行 – Constantin

+0

我改变了split()方法中的参数,现在它正在工作!非常感谢! :) – lydiaP

0

String类有哪些可以用来比较,不论案件的两个字符串的equalIgnoreCase方法。所以:

String var1 = "Die"; 
String var2 = "die"; 

System.out.println(var1.equalsIgnoreCase(var2)); 

会打印TRUE。

+0

但是我怎样才能比较每个线和其他所有文件?等于方法不是问题。 – lydiaP

1

而不是list.add(s);,请使用list.add(s.toLowerCase());。现在你的代码正在比较不确定情况下的行和下面的行。

0

如果我的问题是正确的,你想知道如何从文件中获取前缀,比较它,获取它后面的值,并对每个前缀进行总结。这是对的吗?

您可以使用正则表达式分别获取前缀和值。然后你可以总结所有具有相同前缀的值并将它们写入每个文件。

如果你不熟悉正则表达式,这个链接可以帮助你:

Regex on tutorialpoint.com

Regex on vogella.com

有关其他教程只是扫描谷歌为“Java的正则表达式”或类似的标签。

如果您不想区分大小写字符串,只需将它们全部转换为lower/upper,然后再将它们作为@spork解释。

1

使用Java 8,标准问题的最好办法像读取文件,比较,分组,收集是使用流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并在循环中手动进行求和。

+0

我提供了一个使用你的第二种方法的例子,但我必须说,第一种方法是该死的好:) – Constantin