【问题标题】:Reading lines from text file in Java and splitting the content从 Java 中的文本文件中读取行并拆分内容
【发布时间】:2014-09-28 11:28:24
【问题描述】:

我有一个输入文件如下:

conf/iastedCSN/KangHPLNL06 Quoc V. Phung    
conf/iastedCSN/KangHPLNL06 Kungmeng Lo  
conf/iastedCSN/KangHPLNL06 Hoang Nam Nguyen 
conf/iastedCSN/KangHPLNL06 M. M. Lee    
series/sci/ZighedAB13 Djamel Abdelkader Zighed  
series/sci/ZighedAB13 Rafik Abdesselam  
series/sci/ZighedAB13 Ahmed Bounekkar   
series/sci/LermanG13 Isra챘l-C챕sar Lerman

我想用分隔符输出如下:

conf/iastedCSN/KangHPLNL06 | QuocV.Phung    
conf/iastedCSN/KangHPLNL06 | KungmengLo 
conf/iastedCSN/KangHPLNL06 | HoangNamNguyen 
conf/iastedCSN/KangHPLNL06 | M.M.Lee    
series/sci/ZighedAB13 | DjamelAbdelkaderZighed  
series/sci/ZighedAB13 | RafikAbdesselam 
series/sci/ZighedAB13 | AhmedBounekkar  
series/sci/LermanG13 | Isra챘l-C챕sarLerman

但是现在,我的结果中有很多行重复,我似乎无法找出原因。 我得到的输出如下:

conf/iastedCSN/KangHPLNL06 | QuocV.Phung    
conf/iastedCSN/KangHPLNL06 | KungmengLo 
conf/iastedCSN/KangHPLNL06 | HoangNamNguyen 
conf/iastedCSN/KangHPLNL06 | M.M.Lee    
conf/iastedCSN/KangHPLNL06 | M.M.Lee    
series/sci/ZighedAB13 | DjamelAbdelkaderZighed  
conf/iastedCSN/KangHPLNL06 | M.M.Lee    
series/sci/ZighedAB13 | RafikAbdesselam 
conf/iastedCSN/KangHPLNL06 | M.M.Lee    
series/sci/ZighedAB13 | AhmedBounekkar  
conf/iastedCSN/KangHPLNL06 | M.M.Lee    
series/sci/LermanG13 | Isra챘l-C챕sarLerman   
series/sci/ZighedAB13 | AhmedBounekkar  

以下是源代码:

package authorgraph;
import java.io.*;
import java.util.*;

public class graph {
    private static BufferedReader br;

    public static void main(String[] args)
    {
        try{
        br = new BufferedReader (new FileReader ("inproceedings-author-test1.txt"));
        Map<String, String>  items = new TreeMap<String, String>();
        String line;

        while (null != (line = br.readLine()))
        {
            String[] line_parts = line.split(" ");
            if (line_parts.length > 1)
            {
                StringBuilder name = new StringBuilder(line_parts[1]);
                for (int i = 2; i < line_parts.length; i++)
                {
                    name.append(line_parts[i]);
                }
                items.put(new String(line_parts[0]), name.toString());
            }
            for (String conf: items.keySet())
            {
                System.out.println(conf + " | " + items.get(conf));
            }
        }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
};

任何帮助将不胜感激

【问题讨论】:

    标签: java arrays string file-structure


    【解决方案1】:

    items.put(new String(line_parts[0]), name.toString()); 中的new String 没用。字符串是不可变的,如果你已经有一个字符串,就不需要创建一个新的。

    你得到了重复,因为for 没有放在正确的位置:你每次读取一行时都在执行它。

            for (String conf: items.keySet())
            {
                System.out.println(conf + " | " + items.get(conf));
            }
          } // end of while
    

    改为:将for 移到while 循环之外。

          } // end of while
            for (String conf: items.keySet())
            {
                System.out.println(conf + " | " + items.get(conf));
            }
    

    不要在keySet()上循环,而是这样做:

            for (Map.Entry<String, String> entry : items.entrySet()) {
                System.out.println(entry.getKey() + " | " + entry.getValue());
            }
    

    Map&lt;K,V&gt;.entrySet() 将返回一个Map.Entry&lt;K,V&gt;。条目是键与其值之间的关联。

    【讨论】:

    • 你能用预期输出的摘录编辑你的问题吗?
    • 我用预期的输出编辑了它。我只是通过删除 map.entry 得到了结果,而只写了普通的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多