我在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 - 在9月23日星期一00:00:09 GMT + 00:00开始执行FOR test3625”,所以键是测试ID
答案 0 :(得分:3)
HashMap将数据保存为,其中key是唯一的,因此在您的情况下,
String tempId = line.substring(42, line.length() - 38);
是关键,当你从文件中读取它时,这可能不是唯一的。这是问题所在,你必须确保密钥是唯一的。
答案 1 :(得分:0)
最可能的解释是文件中的许多行具有相同的startId
。每次put
具有相同密钥的键/值对时,您实际上替换该键的上一个映射条目。 (A Map
将一个键映射到一个值......)
这可能是因为id 真的相同,或者可能是你从每行中提取id的方式不正确;例如如果实际的id并不总是从字符42开始。
根据我的统计,您的示例行中的字符42是2
中的3625
...这似乎不正确!
答案 2 :(得分:0)
要使用HashMaps,您需要所有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))