0

@edit ITは機能します、答えてくれてありがとう:)私が悪いと思ったのは

WORLD[i]=global.Values.CHUNKPATTERN();

単純に右側のオブジェクトを取得し、その値を複製して、左側の部分に割り当てますが、2 つの間の参照を確立することがわかります。再度、感謝します:)

私は単純な初心者/初心者の配列の問題を抱えています:

for(int i=0; i<global.Values.WORLDVOLUME(); i++)  
// global.Values.WORLDVOLUME() --> const, int. always the same.
{
WORLD[i]=global.Values.CHUNKPATTERN(); //to pre-define as 'zero only' object. Always the same. Const.
WORLD[i].chunknr=i+1;
}

System.out.println(WORLD[4].chunknr);

もちろんWORLD[0]、chunknr を 1 にWORLD[4]したい、chunknr を 5 にしたい、などなど。

代わりにWORLD[i].chunknr=i+1; 、(だけでなく)すべての要素のchunknrを更新するようですWORLD[i]。ここのように見えるようWORLD[0].chunknr = WORLD[1].chunknr=global.Values.WORLDVOLUME()に。誰もそれをバイパスする方法を知っていますか? 簡単な解決策があると思います...オブジェクトの配列を正しく理解していますか?

あなたは好きにすることができます(クラスとコンストラクターがある場合)

Point POINTARRAY[]= new Point[10];
POINTARRAY[1].x=5
POINTARRAY[1].y=6
POINTARRAY[3].x=17
POINTARRAY[3].y=1

右?ループ経由でそれを割り当てる方法は?

4

4 に答える 4

0

この行はあなたの問題です:

WORLD[i]=global.Values.CHUNKPATTERN();

WORLD[i]これは への参照を割り当てていますglobal.Values.CHUNKPATTERN()。つまり、両方が同じオブジェクトを指しています! そして、ループの反復ごとに、同じグローバル オブジェクトへの参照をどんどん作成しているだけです。

時々、これはあなたが望むものではありません。この場合、値をコピーする必要があります。これはさまざまな方法で実行できますが、ほとんどの場合、単純に複製できます。すべての Java オブジェクトはclone()メソッドをサポートしていますが、クラスに対して正しいことを行うためにメソッドをオーバーライドする必要がある場合があります。

これが意味することは、上記の行を次のように置き換える必要があるということです。

WORLD[i]=(YourType)global.Values.CHUNKPATTERN().clone();

whereYourTypeは、投稿したコード スニペットから省略したため、クラスの実際の型です。

それが役立つことを願っています!

于 2012-12-18T21:44:15.217 に答える
0

次の行は常に同じ参照を返すと思います:

global.Values.CHUNKPATTERN();

したがって、異なる配列インデックスは実際には同じ参照を指しています。上記の機能がどのように機能するかを教えてくれなかったため、推測にすぎません。

以下は、異なる配列要素が同じインスタンスを指す可能性がある例です。

public class AClass{ 
  public int val = 0;

 }
AClass[] array = new AClass[2];
AClass classInstance = new AClass();
array[0] = classInstance;
array[1] = classInstance;

上記のコードは、単一の AClass オブジェクト (classInstance) をインスタンス化しましたが、2 つの異なる配列要素を使用して同じインスタンスを参照しています。

System.out.println("array 1 value " + array[1].val ); // both element initialized to 0 so it prints 0
array[0].val = 15; // actually is classInstance.val to be modified, through the reference to it stored inside the first element of the array. 
System.out.println("array 1 value " + array[1].val ); // print 15

POINT の例では、次のように for ループを使用できます。

Point POINTARRAY[]= new Point[10];
for(int i = 0 ; i < POINTARRAY.length; ++i)
{
  POINTARRAY[1].x=...;
  POINTARRAY[1].y=...;

}
于 2012-12-18T21:38:58.290 に答える
0

代わりWORLD[i].chunknr=i+1;に、すべての要素のチャンク番号を更新するようです。

WORLD[0]とはWORLD[1] のオブジェクトですか? `WORLD[0] == WORLD[1]がtrue に評価される場合、それらは違いはありません。

あなたが持っている:

WORLD[i]=global.Values.CHUNKPATTERN();

呼び出されるたびにオブジェクトCHUNKPATTERNを作成しますか?new

于 2012-12-18T21:39:10.030 に答える
0

きっとこの方法

WORLD[i]=global.Values.CHUNKPATTERN();

常にオブジェクトの同じインスタンスを返すため、配列のすべてのスロットで同じオブジェクトへの参照があります。

続いて

WORLD[i].chunknr=i+1;

chunknr反復ごとに同じオブジェクトの属性を変更します。あなたは言う

...すべての要素のチャンク番号を更新するようです

すべての要素が同じインスタンスを参照するためです。

global.Values.CHUNKPATTERN();毎回新しいオブジェクトを返す方法を見つける必要があります。

于 2012-12-18T21:40:46.953 に答える