2014-09-28 7 views
0

У меня есть входные файлы следующим образом:Чтение строки из текстового файла в Java и разделив содержание

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

Любая помощь будет очень ценна

ответ

2

new String в items.put(new String(line_parts[0]), name.toString()); бесполезно. Строка неизменной, если у вас уже есть 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<K,V>.entrySet() возвратит Map.Entry<K,V>. Запись представляет собой связь между ключом и его значением.

+0

Не могли бы вы отредактировать свой вопрос с выводом ожидаемого результата? – NoDataFound

+0

Я отредактировал его с ожидаемым выходом. И я получил результат, удалив map.entry и просто напишу обычную строку. – fuschia