2016-04-22 74 views
0

我試圖創建一個void方法,它將讀取csv文件並計算狀態的數量,例如TX的次數,多少次哦,以及Dc的次數。 out應該是-TX = 4; OH = 2; DC = 2。但我的輸出是「對於輸入字符串:」F「」 - 我真的無法得到問題在哪裏。有人幫助我?計算列數據

「Crimerate.csv」

州縣率

TX,達拉斯,39

TX,Aderson,10

哦,弓箭手,20

DC,DC ,50

Tx,Houston,31

TX,克勞德,13

噢,貝克薩爾,10 DC,SE,40

public static void countnumber() 

{ 

     try{ 

    List<String>number=Files.readAllLines(Paths.get("Crimerate.csv")); 


      double sum=0,num=0; 

      for (String line:number){ 

       if(num==0){ 

        ++num; 

        continue; 

       } 

       line=line.replace("\"",""); 

       String []result=line.split(","); 



       double close = Double.parseDouble(result[6]); 

       String numberAsString = Double.toString(close); 



       if(numberAsString.equals("Tx")) 
       { 
        sum++; 
        System.out.println("number of Tx =" + sum); 
       } 
       else if(numberAsString.equals("Oh")) 
       { 
        sum++; 
        System.out.println("number of Oh =" + sum); 
       } 
       else if(numberAsString.equals("Dc")) 
       { 
        sum++; 
        System.out.println("number of Dc =" + sum); 
       } 
       } 

     }catch(Exception e){ 
      System.out.println(e.getMessage()); 

     } 
    } 


public static void main (String args[]) 

{ 

countnumber(); 

} 
+0

您正在遞增每個if語句上相同的總和變量 – Priyamal

+0

幾天前才問這個問題嗎?無論如何,每個「國家」都需要有一個櫃檯。此外,由於某些原因,州有「Tx」和「TX」,所以它應該是'numberAsString.equalsIgnoreCase()'。更好的解決方案是將狀態轉換爲統一的情況,並使用「Map 」跟蹤而不是試圖列出所有狀態。 – KevinO

回答

0
   int txCount = 0; 
       int ohCount = 0; 
       int dcCount = 0; //create this variables inside the class(instance variables) 


       if(numberAsString.equals("Tx")) 
       { 
        ++txCount; 
        System.out.println("number of Tx =" + txCount); 
       } 
       else if(numberAsString.equals("Oh")) 
       { 
        ++ohCount; 
        System.out.println("number of Oh =" + ohCount); 
       } 
       else if(numberAsString.equals("Dc")) 
       { 
        ++dcCount; 
        System.out.println("number of Dc =" + dcCount); 
       } //its better if u use equalsIgnoreCase on if Statements 
如果環路你指的相同總和可變每個

,我已固定的。 我假設您在閱讀文件時編寫的代碼是正確的。

0

您只需要爲每個總和使用不同的sum變量。並在循環後打印結果。

try{ 

    List<String>number=Files.readAllLines(Paths.get("Crimerate.csv")); 


     double sumTx=0,sumOh=0,sumDc=0,num=0; 

     for (String line:number){ 

      if(num==0){ 
       ++num; 
       continue; 
      } 

      line=line.replace("\"",""); 

      String []result=line.split(","); 

      double close = Double.parseDouble(result[6]); 
      String numberAsString = Double.toString(close); 

      if(numberAsString.equals("Tx")) { 
       sumTx++; 
      } else if(numberAsString.equals("Oh")){ 
       sumOh++; 
      } else if(numberAsString.equals("Dc")){ 
       sumDc++; 
      } 
     } 
     System.out.println("number of Tx =" + sumTx); 
     System.out.println("number of Oh =" + sumOh); 
     System.out.println("number of Dc =" + sumDc); 
    }catch(Exception e){ 
     System.out.println(e.getMessage()); 

    } 
} 
1

雖然先前建議答案將說明爲什麼有隻有一個響應(只具有一個總和變量的結果)的具體問題,他們有兩個問題。

  • 他們沒有考慮在示例數據中德克薩斯州顯示爲「Tx」和「TX」的事實。因此,目前的其他答案不會給德克薩斯州4的正確結果(他們只會顯示2)。
  • 這些方法假定顯示完整的數據集。如果其他國家存在,那麼代碼將需要不斷擴大以支持新的國家。

該解決方案處理這兩種情況。基於在問題提出的數據

public static void main(String[] args) 
{ 
    Map<String, Integer> countByState = new HashMap<>(); 
    List<String> number; 
    try { 
     number = Files.readAllLines(Paths.get("f:/tmp/Crimerate.csv")); 

     int cntr = 0; 
     for (String line : number) { 
      // skip first line 
      if (cntr++ == 0) { 
       continue; 
      } 
      String []result=line.split(","); 

      // should add error checking 
      String state = result[0].toUpperCase(); 

      Integer cnt = countByState.get(state); 
      if (cnt == null) { 
       cnt = new Integer(0); 
      } 
      countByState.put(state, ++cnt); 

     }    

     System.out.println(countByState); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

示例結果(僅存在一個DC在於數據):

{TX = 4,OH = 2,DC = 1}

+0

非常感謝你現在完美的工作@KevinO – user6167014

+0

@ user6167014,很樂意提供幫助。如果合適,你會考慮接受這個答案嗎? – KevinO

+0

是的,我在@KevinO – user6167014