2

コードについて話すよりも、コードを示す方が簡単です。また、インターウェブで答えを検索しましたが、何も見つからなかったので、私のコードは次のとおりです。

http://pastebin.com/M606mXzR

また、50 ~ 70 行目にある出力も追加しました。61-70 からの出力は、私が望む「正しい」ものです。

fill() メソッドを間違って使用していますか、それとも何ですか? これじゃ頭が回らない…

本当に違いはありますか?

ClassB[][] classB_2Array = new ClassB[10][10];

この間:

for (ClassB[] classB_1Array : classB_2Array) {
            Arrays.fill(classB_1Array, new ClassB());
}

これに:

for (int i = 0; i < classB_2Array.length; i++) {
    for (int j = 0; j < classB_2Array[0].length; j++) {
        classB_2Array[i][j] = new ClassB();
    }
}

とにかく、私のコードをチェックして、あなたの答えに感謝します!

4

1 に答える 1

4

質問への回答:はい、違いがあります ( JavaDocを参照)。

最初のバージョンでは、行の配列要素ごとに 1 つのオブジェクト インスタンスが配置されます。したがって、このインスタンスへの変更は、配列の同じ行のすべての要素に表示されます。i ClassB合計でインスタンスがあります。

2 番目のバージョンは、独自のインスタンスを各配列要素に入れます。i*j ClassB合計でインスタンスがあります。

コードの最初のバージョンは次と同等です

for (ClassB[] classB_1Array : classB_2Array) {
    ClassB instance = new ClassB();
    Arrays.fill(classB_1Array, instance);
}

この情報がお役に立てば幸いです。私はあなたのペーストビン コードを見ていませんでした。

編集:

あなたの誤解を明確にするために、このプログラムの出力をよく見てください。

import java.util.Arrays;

public class ArrayFiller {
    public static void main(String[] args) {
        // your first version:
        Person[][] yourFirstVersion = new Person[2][2];
        for (Person[] array : yourFirstVersion) {
            Arrays.fill(array, new Person("Mike"));
        }
        System.out.println(Arrays.deepToString(yourFirstVersion));
        yourFirstVersion[0][1].setName("Paul");
        System.out.println(Arrays.deepToString(yourFirstVersion));
        System.out.println("-----");
        // equivalent: my version:
        Person[][] myVersion = new Person[2][2];
        for (Person[] array : myVersion) {
            Person person = new Person("John");
            Arrays.fill(array, person);
        }
        System.out.println(Arrays.deepToString(myVersion));
        myVersion[0][1].setName("Thomas");
        System.out.println(Arrays.deepToString(myVersion));
        System.out.println("-----");
        // your second version
        Person[][] yourSecondVersion = new Person[2][2];
        for (int i = 0; i < yourSecondVersion.length; i++) {
            for (int j = 0; j < yourSecondVersion[i].length; j++) {
                yourSecondVersion[i][j] = new Person("Max");
            }
        }
        System.out.println(Arrays.deepToString(yourSecondVersion));
        yourSecondVersion[0][1].setName("Chris");
        System.out.println(Arrays.deepToString(yourSecondVersion));
    }

    private static class Person {
        private String name;
        public Person(String name) {
            System.out.println("Constructor called for " + name);
            this.name = name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return name;
        }
    }
}

出力は次のとおりです。

Constructor called for Mike
Constructor called for Mike
[[Mike, Mike], [Mike, Mike]]
[[Paul, Paul], [Mike, Mike]]
-----
Constructor called for John
Constructor called for John
[[John, John], [John, John]]
[[Thomas, Thomas], [John, John]]
-----
Constructor called for Max
Constructor called for Max
Constructor called for Max
Constructor called for Max
[[Max, Max], [Max, Max]]
[[Max, Chris], [Max, Max]]
于 2012-12-30T19:09:16.073 に答える