2016-04-22 163 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