0

このコード スニペットを見て、2 つの while ステートメントを 1 つにまとめる方法があるかどうか教えてください。

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 が作成されます。
2 番目の while ステートメントは、その配列に値を設定します。
2 つの while ステートメントの使用を避けることはできますか?

注:これは割り当て用であり、配列を使用する必要があります。

4

5 に答える 5

1

彼らが言っているように、ArrayList を使用してアイテムを格納します。

メモリが問題になる場合は、ArrayList.toArray() を使用して必要最低限​​のメモリに切り詰めることができます。

効率が問題になる場合は、おそらく最初にファイルから読み取るべきではありません。

于 2012-11-16T14:52:25.517 に答える
0

なぜ配列を作成するのですか?を作成し、(配列が必要な場合は) ArrayList.toArray()を使用して結果の配列を抽出するwhileループを1つ作成してみませんか?ArrayList

于 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()に変更することで、2つの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 に答える