0

次のような入力ファイルがあります。

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();
        }
    }
};

どんな助けでも本当に感謝します

4

1 に答える 1

2

インnew Stringitems.put(new String(line_parts[0]), name.toString());ダメです。文字列は不変であるため、すでに文字列がある場合は、新しい文字列を作成する必要はありません。

が適切な場所に配置されていないため、重複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<K,V>.entrySet()を返しますMap.Entry<K,V>。キーとその値の間の関連付けであるエントリ。

于 2014-09-28T11:32:50.947 に答える