1

ここで何が起こっているのかを理解しようとしており、助けていただければ幸いです。新しいオブジェクトを作成して ArrayList に追加するループがあります。しかし、ループを通過するたびに、新しいオブジェクトが実際には以前に作成されたオブジェクトも変更しているように見えます。ArrayList には実際にはオブジェクトへの参照しか含まれていないことは理解していますが、毎回 new を呼び出すことで新しいインスタンスが作成されるため、各参照が一意になると考えました。

コードは次のとおりです。

void copyFields()
{
    String fruitStr = "apple red,banana yellow,orange orange,pear green,grape purple";

    String[][] fruitArray = new String[5][];
    String[] fruitPairs = fruitStr.split(",");
    int r = 0;
    for (String fruitPair : fruitPairs) 
    {
        fruitArray[r++] = fruitPair.split(" ");
    }

    ArrayList<Fruit> fruitList = new ArrayList<Fruit>();
    for (String[] f : fruitArray)
    {
        Fruit fruitObj = new Fruit(f[0],f[1]);
        fruitList.add(fruitObj);
    }
}

したがって、最後に fruitList には 5 つのオブジェクトが含まれます。これらはすべて、fruitArray の最後の要素 (紫のブドウ) と同じです。

果物と色のペアのリストを含む文字列から、2 次元配列、果物オブジェクトの ArrayList に移動しようとしていることがわかります。for ループを実行するたびに、fruitList 内の以前のすべてのオブジェクトが変更されるという fruitList の作成をデバッガーで監視するまで、各ステップが正しく機能していることを確認できます。

ここで何が欠けていますか?

4

3 に答える 3

2

私はあなたのコードをテストしました、そしてそれは古典的なFruit実装で動作します:

public class Fruit {
    private String name;
    private String color;

    public Fruit(String name, String color) {
        this.color = color;
        this.name = name;
    }
}

だから私はフィールドが次のようになっていると思いますstatic

public class Fruit {
    private static String name;
    private static String color;

    public Fruit(String name, String color) {
        Fruit.color = color;
        Fruit.name = name;
    }
}
于 2013-03-18T11:06:37.890 に答える
0

次の例を作成し、compileonlineでテストしましたが、問題はありませんでした。問題はおそらくあなたのFruidクラスにあります:

import java.util.ArrayList;

public class HelloWorld{
    public static void main(String []args){
        String fruitStr = "apple red,banana yellow,orange orange,pear green,grape purple";

        String[][] fruitArray = new String[5][];
        String[] fruitPairs = fruitStr.split(",");
        int r = 0;
        for (String fruitPair : fruitPairs) 
        {
            fruitArray[r++] = fruitPair.split(" ");
        }
        ArrayList<String> testList = new ArrayList<String>();
        for (String[] f : fruitArray)
        { 
            String testString = f[0] + " + " + f[1];
            System.out.println(testString);
            testList.add(testString);
        }
        for (String s: testList) {
            System.out.println(s);
        }
     }
} 

結果:

apple + red
banana + yellow
orange + orange
pear + green
grape + purple
apple + red
banana + yellow
orange + orange
pear + green
grape + purple
于 2013-03-18T11:07:43.920 に答える
0

アプリの他の場所に中間体が必要ない場合はfruitArray、次のようにコードを簡素化できます。

String pairsStr = "apple red,banana yellow,orange orange,pear green,grape purple";
ArrayList<Fruit> fruits = new ArrayList<Fruit>();

String[] pairs = pairsStr.split(",");
for (String pairStr : pairs) {
    String[] pair = pairStr.split(" ");
    fruits.add(new Fruit(pair[0], pair[1]));
}
于 2013-03-18T11:03:24.830 に答える