Javaでの動的名を使用した変数の割り当て


96

次のようにJavaで変数のセットを割り当てたいのですが。

int n1,n2,n3;

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

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


1
質問を明確にしていただけませんか?
Eng.Fouad

4
ローカル変数に対してこれを行う必要がありますか?なぜ配列要素ではないのですか?
Ray Toal

@ Eng.Fouad:名前で変数に動的にアクセスしたい。
アシシュアナンド

回答:


111

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

達成しようとしていることに応じて、配列a 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を使用する場合、バイトコードファイルで変数を「宣言」できます。しかし、それをしないでください!その方法は狂気です!


1
たくさんありがとう、私が探していたものを手に入れました。最後の部分(Map <String、integer>)。
アシシュアナンド

1
たとえそれが可能であったとしても、それはあなたが実際に行うことではないことに注意すべきです。あなたはそれから何も得ません。実際には読みにくくなります。それらをリンクしたい場合は、 Map<String, T>代わりに、実際のコードをいじらないでください。
Jeroen Vannevel 2013

2
@JeroenVannevel-それが私が「狂気」によって意味したものです:-)
スティーブンC

35

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

大まかな迅速で汚い例はこれです:

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);
        }
    }
}

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


3
Androidのセンサーevent.values []を一連の変数に変換する必要がある場合に最適です。event.values []の長さは1〜6にすることができ、配列のないjsonマーシャリングの場合は、変換するのに便利です。
Farshid T 2015

12

必要なのは配列という名前です。私は次のコードを書きたかった:

int[] n = new int[4];

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

1
配列を使いたくない。条件に応じて変数(n1、n2、n3)に動的にアクセスしたい。
アシシュアナンド

10

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");

7

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

あなたの場合、あなたは配列を使うことができます:

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

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


4

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

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

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }

4

あなたはしません。あなたができる最も近いことは、それをシミュレートするためにマップを操作すること、または処理するために独自のオブジェクトを定義することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.