0
private static String getArgValue(String[] argsString, int[] jIndex, String classTag) {

    String thisToken;

    for( ; jIndex[0]<argsString.length ; jIndex[0]++) {
        System.out.println("jIndex[0]: " + jIndex[0]);

        if (condition) {
            // yadda yadda yadda
            jIndex[0]++;
            System.out.println("jIndex[0]: " + jIndex[0]);
            return retString;
        }
    }

    return retString;
}

配列と配列の両方でラップしようとしましたが、どちらも元の変数Integerに変更を加えていません。i呼び方:

int[] j = new int[1];

for(int i=2; i< argsString.length; i++) {
    // yadda yadda yadda
    System.out.println("opening i: " + i);
    j[0] = i;

    thisArgValueString = getArgValue(argsString, j, thisArgClassString);
    System.out.println("closing i: " + i);
}

出力例:

opening i: 2
jIndex[0]: 2
jIndex[0]: 3
jIndex[0]: 5
closing i: 2
4

5 に答える 5

2

私自身ではなく、intホルダーを印刷してみてください。

System.out.println("closing i: " + j[0]);

または、単にiを再割り当てすることもできます。

i = j[0];
System.out.println("closing i: " + i);

元のvarialbeiはプリミティブ型であるため、それ自体は変更されません。整数も不変であるため、役に立ちません。したがって、提供したコードは基本的に正しいアプローチです。に値をj[0] = i割り当てるだけで、のコンテンツをリンクしないことを理解する必要があります。したがって、その時点から(この投稿の最初のコードのように)作業するか、(この投稿の2番目のコードのように)元に再割り当てすることができます。ij[0]j[0]ij[0]ij[0]

于 2012-06-04T10:51:22.687 に答える
1

AnIntegerは不変ですが、どうやらそれを変更可能であるかのように使用しようとしていたようです。それはうまくいきません。

一方、anint[1]は可変intホルダーとして使用できます...

...そして、あなたの例でそれが機能していないように見える理由は、最後の印刷ステートメントで、呼び出しで更新したホルダーでiはなく、印刷しているためです。最後のステートメントを次のように変更します。jgetArgValue

    System.out.println("closing i: " + j[0]);

これは、実際の参照による呼び出しではなく、シミュレートされた参照による呼び出しであることを忘れないでください。シミュレーションを機能させるには、フープを正しい順序でジャンプする必要があります。

于 2012-06-04T10:49:25.603 に答える
1

Javaは値渡しであり、期待する動作、つまりiの内容が変更されるという動作は、オブジェクトと一貫して発生します。ここで、渡す値はオブジェクト参照です。ただし、chars、ints、doublesなどのプリミティブを使用すると、実際のデータ自体を渡すことになります。j [0]に入れるのは、変数iではなく、iの内容です。したがって、同じ内容の2つのメモリ位置(j[0]とi)があります。ただし、j [0]を変更しても、iはまったく関係がないため、影響を受けません。つまり、j[0]の内容をiにコピーしただけです。オブジェクトをメソッドに渡すときは、実際にはオブジェクト参照を渡すので、同じオブジェクトを参照しています。iを整数にキャストすることにより、それを自動ボックス化することになります。つまり、iのコピーを作成することになります。

于 2012-06-04T10:51:59.440 に答える
1

コードスニペットは、配列の可変性と参照渡しの意味について誤解があることを示しています。

問題の核心にある本質的でないがらくたをすべて取り除く、より単純化された例を挙げましょう。

public static void main(String[] args) {
   int numberToModify = 42;
   int [] arr = new int[1];
   arr = numberToModify;
   System.println("numberToModify="+numberToModify );
   System.println("arr[0]="+arr[0]);
   doStuff(arr);
   System.println("numberToModify="+numberToModify );
   System.println("arr[0]"+arr[0]);
}

private static void doStuff(int[] array){
   array[0] = 100;  
}

あなたが見るべきものは印刷されています

numberToModify=42
arr[0]=42
numberToModify=42
arr[0]=100

コード例では、メソッド内で配列が変更されたときに、変数i(ここではnumberToModify)も変更されているはずです。配列は実際の値型を保持しているため、そうではありません(intsはプリミティブであり、プリミティブは値によって渡されるため)。

于 2012-06-04T10:57:20.147 に答える
0

それで、変数iに加えられたすべての変更を保持させたいですか?整数オブジェクトとして宣言してみましたか?intはプリミティブ型であるため、参照で渡すことはできません。何かでラップすると、その値が割り当てられます。次のようなことを試してください。

for(Integer i=2; i< argsString.length; i++) {
// yadda yadda yadda
System.out.println("opening i: " + i);
j[0] = i;

thisArgValueString = getArgValue(argsString, j, thisArgClassString);
System.out.println("closing i: " + i);

}

それで問題が解決するかどうかを確認してください。

お役に立てば幸いです。

于 2012-06-04T10:53:15.330 に答える