Java List不断添加最后一条记录,并将其复制为文件中的记录数

时间:2013-10-11 12:16:37

标签: java arraylist

我的代码中发生了一件奇怪的事情,我只是不确定它们是怎么回事。我有一个看起来像这样的文件:

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

我的java解析器应该创建一个map列表作为结果并返回。但唯一返回的是文件中为文件中的行数重复的最后一条记录。有人可以关注我的代码,并告诉我发生了什么事吗?提前谢谢。

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}]

4 个答案:

答案 0 :(得分:4)

我认为在将新的空地图添加到列表后,您忘记将记录替换为新的空地图。你想要这样的东西:

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

答案 1 :(得分:2)

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

您一直在重复使用相同的地图实例,值会被覆盖。 我还建议创建一个单独的类来存储您的数据,它会更干净。

答案 2 :(得分:1)

您应该移动以下行

Map<String, String> record = new HashMap<String, String>();
在for循环中

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;

    }
}

答案 3 :(得分:1)

这是因为在HashMap中你不能有重复的值..所以,当你这样做时

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

它将检查是否已存在名为“id”的键,如果它已经将它用旧值替换旧值。在第一次迭代中,它不会替换任何东西,但是从下一次迭代开始,它将开始替换旧值。

当你添加

row.add(record);

您反复添加相同的引用,并且由于地图仅包含新插入的值,因此调用相同引用的toString()方法并反复打印相同的值。

你应该添加

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

为每条记录添加新地图。