2012-12-30 30 views
2

比談論它更容易展示代碼。我還搜查了跨網的答案,但找不到任何,所以這裏是我的代碼:如何用fill()方法填充Java中的特定對象的多維數組?

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

回答你的問題:是的,有區別(見JavaDoc)。

您的第一個版本將一個對象實例放入行中的每個單個數組元素。因此,對該實例的更改在數組的同一行中的每個元素中都可見。您將總共有iClassB個實例。

第二個版本將自己的實例放入每個數組元素中。您將總共有i*jClassB個實例。

你的代碼的第一個版本就相當於

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

希望這些信息可以幫助你,我沒看你的引擎收錄的代碼。

編輯:

澄清你的誤解,密切關注這個PROGRAMM的輸出:

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]] 
+0

非常感謝你對你的快速回答! 「將指定的對象引用分配給指定的對象數組的每個元素。」當然...「對象參考」。 我以爲我做了一個「新」對象,當指定新的時候: Arrays.fill(array,new Object); – Furlando

+0

我未檢查答案,因爲我仍然想知道爲什麼Arrays.fill(array,new object())不起作用。我的意思是,我在那裏指定了一個新的關鍵字,所以它應該創建一個新的對象,不參考預先製作的東西。 – Furlando

+1

看看我的答案中的代碼示例。 'new'被該方法調用一次,並且構造函數返回的引用就像我的代碼示例中一樣。主要的事實是:''new'只在你的第一個版本中被調用一次,就像我的代碼示例一樣。 – jlordo