读取输入并将其存储在数组中的问题

时间:2014-05-30 16:12:00

标签: java arrays algorithm

嗨我有一个算法应该读取用户输入保存在一个数组和计数字母使用A使用3 b使用3 ..... 但我的算法不适用于1,3,任何奇数,并使用2,4,偶数.. 任何想法如何解决此错误 谢谢大家的帮助 代码:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    int i = 0;
    char c;
  int counta = 0;
        int countb = 0;
        int countc = 0;
        int countd = 0;
        char [] array = new char [4];
        array[0]='a';
        array[1]='b';
        array[2]='c';
        array[3]='d';

    while (reader.read()!='\n') {
        int x = 1+i;
        char[] cbuf = new char[x];
        c = (char) reader.read();
        cbuf[i] = c;

               if (cbuf[i]==array[0]){
               counta++;
               }
               if (cbuf[i]==array[1]){
               countb++;
               }
               if (cbuf[i]==array[2]){
               countc++;
               }
               if (cbuf[i]==array[3]){
               countd++;
               }
          System.out.println(cbuf);

                i++;

        }

5 个答案:

答案 0 :(得分:2)

问题出现了,因为你每次迭代都要阅读两次。

c = (char) reader.read();
while (c!='\n') {
    int x = 1+i;
    char[] cbuf = new char[x];
    cbuf[i] = c;

           if (cbuf[i]==array[0]){
           counta++;
           }
           if (cbuf[i]==array[1]){
           countb++;
           }
           if (cbuf[i]==array[2]){
           countc++;
           }
           if (cbuf[i]==array[3]){
           countd++;
           }
      System.out.println(cbuf);

            i++;

    c = (char) reader.read(); //read once on every iteration

    }

答案 1 :(得分:0)

每次程序执行reader.read()时,它都会读取一个字符。在while循环中,每次循环时它都会执行reader.read(),以便它可以检查\n。但是你不能保存结果;然后当你说

`c = reader.read()`;

它读取字符;它没有使用它已在while表达式中测试过的那个。

你需要安排一下只读一次的东西。两种可能性(还有其他):

while ((c = reader.read()) !='\n') {
    // other code
    // GET RID OF THIS LINE c = (char) reader.read();

while (true) {
    c = (char) reader.read();
    if (c == '\n') {
        break;
    }
    // other code
    // and so on

这不会修复代码中的其他错误;它只是向您展示了几种可以避免在这种情况下调用函数的方法。

答案 2 :(得分:0)

您正在调用reader.read()两次,一次在循环条件中,然后分配给'c'。第一次导致缓冲区被读取和“浪费”,因此跳过了一半的字节。您可以在循环外定义'c',然后使用

while ((c = reader.read()) != '\n') {

在非相关说明中,考虑使用'count'数组来保存计数 - 它通常是定义四个单独变量的首选方法(counta,countb,countc,countd将被替换为int数组计数[ 4]。)然后你可以这样做:

counts[c-'a']++;

自动更新字母'a','b','c'和'd'的计数(假设这是唯一有效的输入)。这一行将取代四个'if'语句!

祝你好运!

答案 3 :(得分:0)

您的代码中存在多个问题。

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
char c;
int counta = 0;
int countb = 0;
int countc = 0;
int countd = 0;
char[] array = new char[4];
array[0] = 'a';
array[1] = 'b';
array[2] = 'c';
array[3] = 'd';

String line = new String();
while ((c = (char) reader.read()) != '\n') {

    if (c == array[0]) {
        counta++;
    }
    if (c == array[1]) {
        countb++;
    }
    if (c == array[2]) {
        countc++;
    }
    if (c == array[3]) {
        countd++;
    }
    line += c;
}
System.out.println(line);
System.out.println("a: " + counta);
System.out.println("b: " + countb);
System.out.println("c: " + countc);
System.out.println("d: " + countd);

这更简单,并且显示用户输入的字符串和每个字符的计数。

答案 4 :(得分:0)

每次调用read()时,它都会接受来自输入的字符。因此,将它存储在变量c中,只有在您准备接受另一个字符时(即在循环结束时)才调用它。还记得检查IOException:

try {
    c = (char)reader.read();  //read a character

    while (c != '\n') {   //check the character
        int x = 1+i;
        char[] cbuf = new char[x];
        cbuf[i] = c;

        if (cbuf[i]==array[0]){
            counta++;
        }
        if (cbuf[i]==array[1]){
            countb++;
        }
        if (cbuf[i]==array[2]){
            countc++;
        }
        if (cbuf[i]==array[3]){
            countd++;
        }
        System.out.println(cbuf);

        i++;
        c = (char)reader.read(); //ready to read another character
    }
} catch (IOException e) {
    e.printStackTrace();
}