次のようにJavaで変数のセットを割り当てたいのですが。
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
これをJavaで実現するにはどうすればよいですか?
次のようにJavaで変数のセットを割り当てたいのですが。
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
これをJavaで実現するにはどうすればよいですか?
回答:
これは、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を使用する場合、バイトコードファイルで変数を「宣言」できます。しかし、それをしないでください!その方法は狂気です!
Map<String, T>
代わりに、実際のコードをいじらないでください。
変数に何らかの動的変数にアクセスしたい場合は、リフレクションを使用できます。ただし、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);
}
}
}
このコードをさまざまな方法で改善する必要があります。これは単なる例です。これも良いコードとは見なされません。
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");
Javaの動的変数名
そのようなことはありません。
あなたの場合、あなたは配列を使うことができます:
int[] n = new int[3];
for() {
n[i] = 5;
}
より一般的な(name, value)
ペアについては、Map<>
この方法を試してください:
HashMap<String, Integer> hashMap = new HashMap();
for (int i=1; i<=3; i++) {
hashMap.put("n" + i, 5);
}