-3

我在 java 中遇到了 BufferedReader 的问题。我正在从大文件中逐行读取,解析行并插入 HashMap,但结果只有几行在 HashMap

Map< Integer, String> data = new HashMap<>(1000000);
    int completedTestsCount = 0;
    BufferedReader reader = new BufferedReader(new FileReader("file.txt"), 120000);
    String line = null;
    while ((line = reader.readLine()) != null) {
        if (line.contains("START executing FOR"))
        {                   
            String tempId = line.substring(42, line.length() - 38);
            int startId = Integer.parseInt(tempId);
            String dateTime = line.substring(6, 14);
            data.put(startId, dateTime);                
        }

这是我要解析的文件中的行示例“INFO 00:00:09 - START execution FOR test3625 at Mon Sep 23 00:00:09 GMT+00:00 2013”​​,所以键是测试 ID

4

3 回答 3

3

HashMap 将数据保存为 ,其中 key 是唯一的,在您的情况下可能如此,

String tempId = line.substring(42, line.length() - 38);

是关键,当您从文件中读取它时,这可能不是唯一的。这就是问题所在,您必须确保密钥是唯一的。

于 2013-10-10T11:35:47.290 回答
0

最可能的解释是文件中的许多行具有相同的startId. 每次您put使用相同键的键/值对时,您实际上都会替换该键的先前映射条目。(AMap将一个键映射到一个值...)

这可能是因为 id确实相同,或者可能是您从每一行中提取 id 的方式不正确;例如,如果实际 id 并不总是从字符 42 开始。

据我计算,您的示例行的字符 42 是2in 3625... ,这似乎不正确!

于 2013-10-10T11:35:22.677 回答
0

要使用 HashMap,您需要所有stardId值都是唯一的。

在这种情况下,您应该使用列表而不是地图。

定义一个自定义KeyValuePair类并在列表中添加对象。

class KeyValuePair{
    int startId;
    String dateTime; 
}

List<KeyValuePair> data = new ArrayList<>();


String tempId = line.substring(42, line.length() - 38);
int startId = Integer.parseInt(tempId);
String dateTime = line.substring(6, 14);
data.add(new KeyValuePair(startId, dateTime))
于 2013-10-10T11:42:19.780 回答