2013-01-18 42 views
1

在下面的代碼中,我只是試圖計算一個項目出現在文件中的次數。但是,當我打印出鍵和它們的值時,我得到的數字是實際存在的數字。當我初始化total到0它修復了這個問題,但我不知道爲什麼。爲什麼我有一個錯誤?

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.util.HashMap; 
import java.util.HashSet; 

public class Problem { 
    public static void main(String[] arg) { 
     HashSet QID = new HashSet(); 
     HashMap QIDToCorrect = new HashMap(); 
     try { 
     // Open the file that is the first command line parameter 
     FileInputStream fstream = new FileInputStream(
       "C:/Users/lol/Downloads/data.csv"); 

     // Get the object of DataInputStream 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

     //Read File Line By Line 
     String strLine; 
     br.readLine(); //skip header line 
     int total = 0; 
     int blah = 0; 
     while ((strLine = br.readLine()) != null) { 

      String[] split = strLine.split(","); 

      if (!QID.contains(split[0])) { 
       total = 1; 
       QID.add(split[0]); 
       QIDToCorrect.put(split[0], total); 
      } else { 
       total += 1; 
       QIDToCorrect.put(split[0], total); 
      } 

      //System.out.println(); 
     } 
     } catch (Exception e) { 
     } 
    } 
} 
+2

你是什麼意思?你在哪裏打印值? – Smit

+0

你每次找到一個你從未見過的單詞時,似乎都會將總數重置爲1。那是故意的嗎? –

+0

是的,我的鍵是項目,值是計數。如果我沒有看到一個項目,那麼我總共初始化爲1,因爲我第一次看到它。 – cooldudezen

回答

0

說你有輸入的每一行的第一個元素如下:

foo 
foo 
bar 
foo 

現在讓我們考慮你的循環不會與該輸入

,而((strLine中= br.readLine())!= NULL){

什麼3210
 String[] split = strLine.split(","); 

split[0]是第一個「foo」。

 if (!QID.contains(split[0])) { 

「foo」 的沒有添加尚未

  total = 1; 
      QID.add(split[0]); 
      QIDToCorrect.put(split[0], total); 

total集到1 「foo」 的加入QID和( 「foo」 的,1)加入到QIDToCorrect

 String[] split = strLine.split(","); 

split[0]是第二個「foo」

 if (!QID.contains(split[0])) { 

Evalutes爲false,因此if聲明落入else

 } else { 
      total += 1; 
      QIDToCorrect.put(split[0], total); 
     } 

total遞增到2和QIDToCorrect被更新爲( 「foo」 的,2)。

 String[] split = strLine.split(","); 

split[0]現在包含「bar」。

 if (!QID.contains(split[0])) { 
      total = 1; 
      QID.add(split[0]); 
      QIDToCorrect.put(split[0], total); 

QID不包含杆,所以total被複位爲1, 「條」 被添加到QID,和( 「條」,1)被插入到QIDToCorrect

 String[] split = strLine.split(","); 

現在split[0]包含第三 「富」

 if (!QID.contains(split[0])) { 

「FOO」 已經看到過,所以通過下降到else

 } else { 
      total += 1; 
      QIDToCorrect.put(split[0], total); 
     } 

total遞增到2和QIDToCorrect與更新( 「foo」 的,2)。

所以你的地圖持有櫃檯認爲只有兩個foo s。我在這裏看到一個問題。每當您看到新項目時,您的total計數器都會重置。因此,當你撥打QIDToCorrect.put()時,你不會考慮過去看過該項目的次數。您可能需要使用QIDToCorrect.get()才能獲得項目的先前計數。這消除了對變量total的需求(除非你想知道你所看到的所有項目的總數)。而且,QID HashSet是不必要的,因爲如果它已經包含密鑰,您可以查詢QIDToCorrect

+0

在我的文件中,所有東西都聚集在一起。意思是你有11111,22222,33333 ....不是11123111。所以這應該不重要。 – cooldudezen

+0

@cooldudezen重要的是你的邏輯不正確。這很可能也是你「一個一個」錯誤的根源。 –

0

您算法是怪異,但如果我理解正確的話你想要做什麼,我將取代

if (!QID.contains(split[0])) { 
       total = 1; 
       QID.add(split[0]); 
       QIDToCorrect.put(split[0], total); 
      } else { 
       total += 1; 
       QIDToCorrect.put(split[0], total); 
      } 

Integer lasttotal = (Integer)QIDToCorrect.get(split[0]); 
total = 1 + lasttotal!=null ? lasttotal : 0; 
QID.add(split[0]); 
QIDToCorrect.put(split[0], total); 

這樣一來,總可以正確計算你的物品,即使他們沒有排序...但是,這並不能解釋你的問題。你確定你打印的值是否正確?你有沒有嘗試一步一步的調試?

0

你需要讓你更新前的鍵的值...見下文:

if (!QID.contains(split[0])) { 
    total = 1; 
    QID.add(split[0]); 
    QIDToCorrect.put(split[0], total); 
} else { 
    total = QIDToCorrect.get(split[0]); // RETRIEVE VALUE FOR KEY 
    total += 1; 
    QIDToCorrect.put(split[0], total); 
}