在Java中使用动态名称分配变量

在Java中使用动态名称分配变量,java,variables,dynamic-variables,Java,Variables,Dynamic Variables,我想在java中分配一组变量,如下所示: int n1,n2,n3; for(int i=1;i<4;i++) { n<i> = 5; } intn1、n2、n3; 对于(int i=1;i您应该使用List或array List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); 甚至更好 Map<String, Integ

我想在java中分配一组变量,如下所示:

int n1,n2,n3;

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

对于(int i=1;i您应该使用
List
array

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

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

//conditionally get 
map.get("n1");
Map Map=newhashmap();
地图放置(“n1”,1);
地图放置(“n2”,2);
//有条件地得到
map.get(“n1”);

您需要的是命名数组。我想编写以下代码:

int[] n = new int[4];

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

对于(inti=1;i这不是Java中的操作方式。Java中没有动态变量。Java变量必须在源代码1中声明

根据您试图实现的目标,您应该使用数组、列表或地图,例如

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);
}
int n[]=新的int[3];
对于(int i=0;i<3;i++){
n[i]=5;
}
列表n=新的ArrayList();
对于(int i=1;i<4;i++){
n、 增加(5);
}
Map n=新的HashMap();
对于(int i=1;i<4;i++){
n、 put(“n”+i,5);
}

可以使用反射动态引用源代码中声明的变量。但是,此仅适用于类成员变量(即静态和实例字段)。它不适用于局部变量。请参见@fyr的“快速脏”示例

然而,在Java中不必要地做这种事情是一个坏主意。它效率低下,代码更复杂,而且由于您依赖于运行时检查,因此它更脆弱。这不是“具有动态名称的变量”。最好将其描述为对具有静态名称的变量的动态访问


1-这句话有点不准确。如果你使用BCEL或ASM,你可以在字节码文件中“声明”变量。但是不要这样做!这样做是疯狂的!

Java中的动态变量名
没有这样的事

在您的情况下,您可以使用阵列:

int[] n = new int[3];
for() {
 n[i] = 5;
}
对于更一般的
(名称、值)
对,请使用
Map

尝试以下方法:

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

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

对于(int i=1;i如果您想访问某种类型的动态变量,可以使用反射。但是反射不适用于局部变量。它仅适用于类属性

一个粗略、快速、肮脏的例子如下:

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);
        }
    }
}
公共类T{
公共整数n1;
公共整数n2;
公共整数n3;
public void accessAttributes()引发IllegalArgumentException、SecurityException、IllegalAccessException、,
NoSuchFieldException{
对于(int i=1;i<4;i++){
T.class.getField(“n”+i).set(本,5);
}
}
}

您需要以各种方式改进此代码—这只是一个示例。这也被认为是不好的代码。

您不需要。您可以做的最接近的事情是使用地图来模拟它,或者定义您自己要处理的对象。

您可以澄清您的问题吗?您需要对局部变量执行此操作?为什么不使用数组元素?@Eng.Fouad:我想动态访问变量名称。@Ashish Anand您的意思是不想使用数组。我想根据某些条件动态访问变量(n1、n2、n3)。Thanx很多,得到了我想要的。最后一部分(地图)。应该注意的是,即使有可能,也不应该是你真正会做的事情。你不会从中获得任何东西;你实际上会失去可读性。如果你想链接它们,请使用
映射,而不要开始弄乱你的实际代码。@Jeroenvanevel-这就是我所说的“疯狂”:-)当您需要将Android的sensor event.values[]转换为一组变量时,这非常好。event.values[]的长度可以从1到6,并且转换起来非常方便,在我的示例中,转换为无数组json封送。
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);
        }
    }
}