java数组和循环情况

时间:2014-01-01 14:19:57

标签: java arrays loops

我们收到一个问题,即制作一个程序,用于输入人名及其性别(n号),并将男孩和女孩分成两个独立的阵列。我编写了以下代码,但它不接受第二个循环中的名称和性别。为什么呢?

import java.io.*;

class arrays
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

    void main()throws IOException
    {
        String name="";
        System.out.println("enter number of students");
        int n=Integer.parseInt(br.readLine());
        String[] c=new String[n];//5
        String[] b=new String[n];//5
        String[] g=new String[n];//5
        char[] s=new char[n];
        System.out.println("enter the name and gender of "+n+" students");
        int i=0;

        do
        {
            System.out.println("enter the data of "+(i+1)+" student");
            c[i]=br.readLine();
            s[i]=(char)br.read();
            i++;
        }
        while(i<n);

        for(int j=0;j<n;j++)
        {
            if(s[j]=='b'||s[j]=='B')
            {
                System.arraycopy(c,j,b,j,1);
            }
            else if(s[j]=='g'||s[j]=='G')
            {
                System.arraycopy(c,j,g,j,1);
            }
        }
        for(int j=0;j<n;j++)
        {
            System.out.print("boys are:-"+b[j]);
            System.out.println("girls are:-"+g[j]);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

输入的方式是这里的问题。 将do-while循环更改为:

do {
        System.out.println("enter the data of " + (i + 1) + " student");
        c[i] = br.readLine();
        s[i] = (char) br.read();            
        br.readLine();       // even a br.read(); would work. Used to read newline
        i++;
   } while (i < n);

答案 1 :(得分:0)

您的问题是,当您br.read()的行为与readLine()不同时。 readLine()读取并包含换行符,但从响应中删除换行符。因此,如果您输入“名称&lt; new-line&gt;”返回“名称”,但“&lt; new-line&gt;”被消耗了。但是,read()只读取一个字符并保留其余字符,因此当您输入“b&lt; new-line&gt;”时“&lt; new-line&gt;”时返回'b'留在输入流上。因此,当您下次使用readLine询问名称时,输入将被解析为下一个“”,恰好是在输入性别时没有字符的左侧新行,因此返回空字符串

您可以使用现有程序和以下输入进行测试:

3
name1
bname2
gname3
b

因此,您需要确保使用新行,或许在阅读完性别后使用br.readLine()。如果你试图通过阅读额外的字符来消费新行,请注意在某些系统上新行实际上是两个字符。