垂直直方图无法正确显示

时间:2016-07-18 08:48:42

标签: java char java.util.scanner histogram charat

这个问题与我4天前制作的问题非常相关here 我需要做的是创建一个垂直直方图,它读取.txt文件中列出的学生成绩(从1到10)的出现次数:

  

马克2   Elen 3
  路加7号   Elen 9
  Jhon 5
  马克4
  Elen 10
  路加1   Jhon 1
  Jhon 7
  Elen 5
  马克3
  马克7

这是我的代码:

import java.util.Scanner;
import java.io.*;

public class GradeHistogram {
  public static void main(String[] args) throws IOException {
    Scanner fileScan = new Scanner(new File("RegistroVoti.txt"));
    String line;
    char currentChar;
    int [] array = new int [10];
    int max = 0, currentValue;

    while (fileScan.hasNext()) {
      line = fileScan.nextLine();
      for(int j=0; j < line.length(); j++) {

        currentChar = line.charAt(j);

        if (currentChar == '1')
          array[0]++;
        else if (currentChar == '2')
          array[1]++;
        else if (currentChar == '3')
          array[2]++;
        else if (currentChar == '4')
          array[3]++;
        else if (currentChar == '5')
          array[4]++;
        else if (currentChar == '6')
          array[5]++;
        else if (currentChar == '7')
          array[6]++;
        else if (currentChar == '8')
          array[7]++;
        else if (currentChar == '9')
          array[8]++;
        else if (currentChar == '0')
          array[9]++;
      }
    }
    for(int i = 0; i <= 9; i++) {
      if (array[i] > max)
        max = array[i]; 
    }
    currentValue = max;
    for(int i = max;  i > 0; i--) {
      for(int j = 0; j < 10; j++) {
        if(array[j] < i)
          System.out.print(" ");
        else
          System.out.print("*");
      }
      System.out.println();
    }
    System.out.println("12345678910");
  }
}

但是,由于charAt()方法根据他创建的单个char打印星号,因此会在数字“1”列中添加“10”的问号。

我实际上通过修改代码尝试了nextInt()方法,但是当我运行它时,没有显示星号......

我该如何解决这个问题?

感谢任何反馈!

提前谢谢!

1 个答案:

答案 0 :(得分:1)

使用正则表达式从行中提取成绩。在该部分上使用Integer.parseInt来获取数字而不是尝试自己实现解析:

Pattern pattern = Pattern.compile("^.+ (\\d+)$");

while (fileScan.hasNext()) {
    line = fileScan.nextLine();
    Matcher m = pattern.matcher(line);
    if (m.find()) {
        array[Integer.parseInt(m.group(1))-1]++;
    }
}