104

次のようにJavaで一連の変数を割り当てたいと思います:

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}

Javaでこれを達成するにはどうすればよいですか?

4

7 に答える 7

124

これは、Java で行う方法ではありません。Java には動的変数はありません。Java 変数は、ソース コードで宣言する必要があります1

達成しようとしていることに応じて、配列、ListまたはMap;を使用する必要があります。例えば

int n[] = new int[3];
for (int i = 0; i < 3; i++) {
    n[i] = 5;
}

List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
    n.add(5);
}

Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
    n.put("n" + i, 5);
}

リフレクションを使用して、ソース コードで宣言された変数を動的に参照することができます。ただし、これはクラス メンバーである変数 (つまり、静的フィールドとインスタンス フィールド) に対してのみ機能します。ローカル変数では機能しません。@fyr の「クイック アンド ダーティ」の例を参照してください。

ただし、この種のことを Java で不必要に行うのは悪い考えです。非効率的で、コードがより複雑になり、実行時チェックに依存しているため、より壊れやすくなります。そして、これは「動的な名前を持つ変数」ではありません。これは、静的な名前を持つ変数への動的アクセスとしてより適切に説明されています。


1 - その記述は少し不正確です。BCEL または ASM を使用する場合は、バイトコード ファイルで変数を「宣言」できます。しかし、それをしないでください!その方法は狂気です!

于 2011-07-18T07:10:08.343 に答える
38

ある種の動的な変数にアクセスしたい場合は、リフレクションを使用できます。ただし、リフレクションはローカル変数では機能しません。クラス属性にのみ適用できます。

大まかな簡単で汚い例は次のとおりです。

public class T {
    public Integer n1;
    public Integer n2;
    public Integer n3;

    public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
            NoSuchFieldException {

        for (int i = 1; i < 4; i++) {
            T.class.getField("n" + i).set(this, 5);
        }
    }
}

このコードをさまざまな方法で改善する必要がありますが、これは単なる例です。これも良いコードとは見なされません。

于 2011-07-18T07:30:29.143 に答える
13

必要なのは名前付き配列です。次のコードを書きたかったのです。

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}
于 2011-07-18T07:09:15.047 に答える
12

Listまたはarray代わりに使用する必要があります

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

または

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;

またはさらに良い

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);

//conditionally get 
map.get("n1");
于 2011-07-18T07:08:12.710 に答える
8

Java の動的変数名
そのようなものはありません。

あなたの場合、配列を使用できます:

int[] n = new int[3];
for() {
 n[i] = 5;
}

より一般的な(name, value)ペアについては、Map<>

于 2011-07-18T07:10:10.547 に答える
5

あなたはそうしない。あなたができる最も近いことは、マップを使ってシミュレートするか、独自のオブジェクトを定義して処理することです。

于 2011-07-18T12:36:06.903 に答える
5

この方法を試してください:

    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }
于 2011-07-18T07:16:11.500 に答える