2013-10-10 220 views
-3

我在java中遇到BufferedReader問題。我讀一行行從大的文件,解析線和插入HashMap的,但結果只有幾行是在HashMap中從java文件中逐行讀取

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 2013「開始執行FOR test3625,所以鍵是測試編號

+0

你用什麼鍵?你可以添加一些代碼嗎? – BobTheBuilder

+0

在此處發佈您的代碼 – SpringLearner

+0

您可以發佈您使用的代碼嗎?這樣,我們可以幫助你,哪一部分你錯了。 =) – justhalf

回答

0

最可能的解釋是文件中的許多行具有相同的startId。每次使用put一個具有相同密鑰的密鑰/值對,您實際上將替換爲該密鑰的上一個映射條目。 (A Map映射一個鍵一個值...)

這可能是因爲ID是真正相同,或者它可能是你正在提取每一行的編號的方法是不正確;例如如果實際ID並不總是從字符42開始。

通過我的計數,您示例行的字符42是23625 ...並且看起來不正確!

3

HashMap中保存數據,其中關鍵是唯一的,因此可能會在你的情況,

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

是關鍵,正如你從文件中讀取它,這可能不是唯一的。這是問題,你必須確保密鑰是唯一的。

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)) 
+0

你假設這些密鑰確實是非唯一的。 OP的問題有另一種解釋;即他提取密鑰的「邏輯」是不正確的。 –

+0

我需要一個dataStructure,其中插入,查找和刪除操作是〜O(1) – user2842269