2013-10-11 4 views
5

私のコードでは奇妙なことが起きていますが、何が起こっているのか分かりません。私は次のようなファイルを持っています:Javaリストは最後のレコードを追加し続け、ファイル内のレコード数を複製します。

id;state;city;total_pop;avg_temp 
1;Florida;;120000;76 
2;Michigan;Detroit;330000;54 
3;New Jersey;Newark;;34 

私のjavaパーサーは結果としてマップのリストを作成して返します。しかし、返されるのは、ファイル内の最後のレコードがファイル内の行数だけ繰り返されることだけです。誰かが私のコードを見て、何が起こっているかについて私に啓発することができますか?前もって感謝します。ここで

public class FileParserUtil { 

    public List<Map<String, String>> parseFile(String fileName, char seperator) 
      throws IOException { 

     CSVReader reader = new CSVReader(new FileReader(fileName), seperator); 
     Map<String, String> record = new HashMap<String, String>(); 
     List<Map<String, String>> rows = new ArrayList<Map<String, String>>(); 

     String[] header = reader.readNext(); 
     String[] nextLine; 

     while ((nextLine = reader.readNext()) != null) { 
      for (int i = 0; i < header.length; i++) { 
       record.put(header[i], nextLine[i]); 
      } 
      System.out.println("--------Here is the record: ---------"); 
      System.out.println(record); 
      rows.add(record); 
      System.out.println("--------Here are the rows: ---------"); 
      System.out.println(rows); 
     } 
     reader.close(); 
     return rows; 

    } 
} 

は、mainメソッドから上記実行のコンソール出力です...

--------Here is the record: --------- 
{id=1, avg_temp=76, state=Florida, total_pop=120000, city=} 
--------Here are the rows: --------- 
[{id=1, avg_temp=76, state=Florida, total_pop=120000, city=}] 
--------Here is the record: --------- 
{id=2, avg_temp=54, state=Michigan, total_pop=330000, city=Detroit} 
--------Here are the rows: --------- 
[{id=2, avg_temp=54, state=Michigan, total_pop=330000, city=Detroit}, {id=2, avg_temp=54, state=Michigan, total_pop=330000, city=Detroit}] 
--------Here is the record: --------- 
{id=3, avg_temp=34, state=New Jersey, total_pop=, city=Newark} 
--------Here are the rows: --------- 
[{id=3, avg_temp=34, state=New Jersey, total_pop=, city=Newark}, {id=3, avg_temp=34, state=New Jersey, total_pop=, city=Newark}, {id=3, avg_temp=34, state=New Jersey, total_pop=, city=Newark}] 

答えて

1

あなたが行うときには、HashMapの中であなたが重複する値を持つことができないので...ですので、この

record.put("id","1"); 

すでに「ID」という名前のキーがあれば、それはそれがない場合、それは置き換えられます、チェックします古い値と新しい値を比較します。最初の反復では何も置き換えませんが、次の反復から古い値を置き換えることになります。

そして、あなたはあなたが何度も何度も同じ参照を追加している

row.add(record); 

を追加し、マップにのみ新たに挿入された値が含まれているので、同じ参照のtoString()メソッドが呼び出され、同じ値が再び印刷したときと再び。

あなたは、レコードごとに新しいマップを追加する

record = new HashMap<String,String>(); 

を追加している必要があります。

+0

ありがとうございます。 –

+0

あなたも大歓迎です...ファイルから値を保存し、そのクラスの新しいインスタンスをすべてのレコードに作成する新しいクラスを作成することをお勧めします。そうすれば、コードはもっときれいになります。 –

+0

これをスピードアップする方法はありますか?それは遅いようです。 –

4

私はあなたがそれがに追加された後、新しい空のマップで記録を交換するために忘れてしまったと思いますリスト。

rows.add(record); 
record = new HashMap<String, String>(); 
1

あなたがforループ内の行

Map<String, String> record = new HashMap<String, String>(); 

を次のように移動する必要があります:あなたはこのような何かをしたい

public class FileParserUtil { 

    public List<Map<String, String>> parseFile(String fileName, char seperator) 
      throws IOException { 

     CSVReader reader = new CSVReader(new FileReader(fileName), seperator); 
     List<Map<String, String>> rows = new ArrayList<Map<String, String>>(); 

     String[] header = reader.readNext(); 
     String[] nextLine; 

     while ((nextLine = reader.readNext()) != null) { 
      Map<String, String> record = new HashMap<String, String>(); 
      for (int i = 0; i < header.length; i++) { 
       record.put(header[i], nextLine[i]); 
      } 
      System.out.println("--------Here is the record: ---------"); 
      System.out.println(record); 
      rows.add(record); 
      System.out.println("--------Here are the rows: ---------"); 
      System.out.println(rows); 
     } 
     reader.close(); 
     return rows; 

    } 
} 
2
while ((nextLine = reader.readNext()) != null) { 
    Map<String, String> record = new HashMap<String, String>(); 
... 
} 

あなたはすべてのマップの同じインスタンスを再利用しています時間、値が上書きされます。 データを保存するために別のクラスを作成することをお勧めします。

関連する問題