嗨我有一个算法应该读取用户输入保存在一个数组和计数字母使用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++;
}
答案 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();
}