0

そのため、基本的にループを通過するたびに配列を 1 つずつ拡張する必要があるコードを作成しようとしています。はい、配列は固定サイズであり、毎回新しい配列が必要であることを知っています。また、配列ではなくリストを使用しても問題はないことも認識していますが、配列の使用を余儀なくされています。

私のコードはそうです:

  public static void getAnimals()
    {
        String animalName[] = new String[1];
        int animalNumber[] = new int[1];
        int lengthOfAnimals;

        animalName[0] = "Null";
        animalNumber[0] = 0;

        while (!animalName[animalName.length - 1].equals("EXTERMINATE"))
        {


            animalName[animalName.length - 1] = JOptionPane.showInputDialog("Name an animal?");
            String numLeft = JOptionPane.showInputDialog("How many are left?");
            animalNumber[animalNumber.length - 1] = Integer.parseInt(numLeft);

            if (animalName[animalName.length - 1].equals("EXTERMINATE"))
            {
                break;
            }

            else
            {

                System.out.println(animalName[animalName.length - 1]);
                animalName = expandName(animalName);
                animalNumber = expandNumber(animalNumber);

            }               
        }




    }

    public static String[] expandName(String animalName[])
    {

        String animalNameExpanded[] = new String[animalName.length + 1];

        for (int a = 0; a <= animalName.length - 1; a++)
        {
            animalNameExpanded[a] =  animalName[a];
        }


        return animalNameExpanded;
    }

    public static int[] expandNumber(int animalNumber[])
    {
        int animalNumberExpanded[] = new int[animalNumber.length + 1];

        for (int a = 0; a <= animalNumber.length - 1; a++)
        {
            animalNumberExpanded[a] =  animalNumber[a];
        }

        return animalNumberExpanded;
    }    

これを実行すると、取得する値が animalName に入力され、animalNumber が null になります。何が起こっているのか、どうすればこれを修正できますか。

4

2 に答える 2

2
String animalNameExpanded[] = new String[animalName.length + 1];

すべてのエントリが である新しい配列を作成しますnull。次に、古い配列から値をコピーして、最後のエントリを除くすべてのエントリを埋めますnull

animalNameExpanded[animalName.length] = "Null";コピーの後に a を追加して、

while (!animalName[animalName.length - 1].equals("EXTERMINATE"))

null次のラウンドで配列からa を読み取りません。

于 2012-10-15T20:15:36.987 に答える
2

@Daniel が言ったことですが、これはArrays.copyOf(T[], int)メソッドの目的でもあります。大きい/小さいサイズをどのように処理するかについては、ドキュメントを確認してください。

Animalまた、さまざまなプロパティに対して個別の配列ではなく、オブジェクトの配列が必要なようです。

編集

実際、ダニエルの提案も素晴らしいスタイルのようには見えません. null 安全な比較を使用する方が簡単です。

while (!"EXTERMINATE".equals(animalName[animalName.length - 1]))

于 2012-10-15T20:21:55.053 に答える