0

任何人都可以看看这段代码并告诉我是否有办法将两个 while 语句合并为一个?

public static void main(String[] args) throws IOException
{
    BufferedReader fileInput;
    fileInput = new BufferedReader(new FileReader("information.txt"));
    int countOfClients = 0;
    while (fileInput.ready())
    {
        fileInput.readLine();
        countOfClients ++;
    }
    int totalClients = countOfClients ;

    Client[] clientDetails = new Client[totalClients];
    int clientNumber = 0;

    while (fileInput.ready())
    {
        String currentLineOfText = fileInput.readLine();
        String clientName = currentLineOfText.substring(0, 19);
        String gender = currentLineOfText.substring(20,21);
        char clientGender = gender.charAt(0);
        int clientAge = Integer.parseInt(currentLineOfText.substring(22,24));
        String clientInterests = currentLineOfText.substring(25);
        clientDetails[clientNumber] = new Client(clientName, clientGender, clientAge, clientInterests);
        clientNumber++;
    }

第一个 while 语句读取文本中的所有行,因此它知道它需要对象数组中有多少元素。
然后创建类 Client[] 的数组 clientDetails。
第二个 while 语句填充该数组。
我可以避免使用两个 while 语句吗?

注意:这是一个分配,我必须使用数组。

4

5 回答 5

1

正如他们所说,使用 ArrayList 来存储项目。

如果内存是一个问题,您可以使用 ArrayList.toArray() 将其修剪到最基本的内容。

如果效率是一个问题,您可能不应该首先从文件中读取。

于 2012-11-16T14:52:25.517 回答
0

为什么要创建数组?为什么不使用一个while循环来创建一个ArrayList然后(如果您需要一个数组)使用ArrayList.toArray()从中提取结果数组?

于 2012-11-16T14:48:23.737 回答
0

您可以使用ArrayList而不是数组,只需使用:

list.add(new Client(...));

如果你真的需要一个数组,你可以随时调用:

Client[] array = list.toArray();
于 2012-11-16T14:48:25.200 回答
0

Client[]您可以通过更改为 ArrayList();来避免两个 while 循环。

例子:

List<Client> clientDetails = new ArrayList<Client>();
    int clientNumber = 0;

    while (fileInput.ready())
    {
        String currentLineOfText = fileInput.readLine();
        String clientName = currentLineOfText.substring(0, 19);
        String gender = currentLineOfText.substring(20,21);
        char clientGender = gender.charAt(0);
        int clientAge = Integer.parseInt(currentLineOfText.substring(22,24));
        String clientInterests = currentLineOfText.substring(25);
        clientDetails.add( new Client(clientName, clientGender, clientAge, clientInterests));
    }

注意:手工编辑,可能存在语法错误。

于 2012-11-16T14:48:30.937 回答
0

如果你真的不能使用预先编写的 ArrayList 类,你总是可以自己有效地重新实现它(或者至少是它的相关部分)。

关键技术是猜测您可能需要的数组大小,定义一个该大小的数组,如果您发现它太小,则创建一个更大的数组并将所有现有值从旧数组复制到新数组数组,然后在剩余的空间中继续。

在循环的另一端,您可能需要再进行一步,并再次缩小数组(通过声明一个较小的数组并复制值),这样您就没有剩余空间了。

或者,正如所有其他答案所建议的那样,只需使用一个 ArrayList,它已经为您完成了这个......

于 2012-11-16T15:02:59.567 回答