在java中创建具有特定名称的动态对象

在java中创建具有特定名称的动态对象,java,Java,我有一个测试输入文件,对于不同的场景,应该在其中创建不同数量的对象 Vertex v0 = new Vertex("a"); Vertex v1 = new Vertex("b"); Vertex v2 = new Vertex("c"); Vertex v3 = new Vertex("d"); Vertex v4 = new Vertex("e"); Vertex v5 = new Vertex("f"); 例如:对于一个测试输入,其必须是3

我有一个测试输入文件,对于不同的场景,应该在其中创建不同数量的对象

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
例如:对于一个测试输入,其必须是3个对象以名称v0、v1、v2创建,而对于其他测试输入,其必须是5个对象以名称v0、v1、v2、v3、v4创建

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
对于5个对象的静态程序,如下所示:

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
对于k=5(对象的数量),我想使其动态如下:

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
for(inti=0;i您需要的是一个

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
如果
somevariable
保存在构造函数中传递的字符串,则print语句的输出将是

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
d
您需要的是

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
如果
somevariable
保存在构造函数中传递的字符串,则print语句的输出将是

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
d

您可以使用
贴图
,其中键是
字符串
(名称),值是
顶点

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
例如:
Map

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
然后您可以这样做:

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
Map<String, Vertex> testObjs = new HashMap<String, Vertex>();

for(int i = 0; i < k; i++)
    testObjs.put("v" + String.valueOf(i), new Vertex(i));

// The names would be like v1, v2, etc.
// Access example
testObjs.get("v1").doVertexStuff();
Map testObjs=newhashmap();
for(int i=0;i
您可以使用
映射,其中键是
字符串(名称),值是
顶点

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
例如:
Map

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
然后您可以这样做:

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
Map<String, Vertex> testObjs = new HashMap<String, Vertex>();

for(int i = 0; i < k; i++)
    testObjs.put("v" + String.valueOf(i), new Vertex(i));

// The names would be like v1, v2, etc.
// Access example
testObjs.get("v1").doVertexStuff();
Map testObjs=newhashmap();
for(int i=0;i
在普通Java中不可能做到这一点。您应该能够使用ASM或某些字节码操作库以某种方式实现它,但这并不值得。最好的方法是使用
Map
。注意
Map
是一个接口,
HashMap
是它的实现

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
String[] names = {"v1", "v2", "v3"};
String[] constructorArgs = {"a", "b", "c"};
Map<String, Vertex> map = new HashMap<String, Vertex>();
for (int i = 0; i < names.length; i++)
{
    map.put(names[i], new Vertex(constructorArgs[i]));
}

for (int i = 0; i < names.length; i++)
{
    Vertex v = map.get(names[i]);
    //do whatever you want with this vertex
}
String[]name={“v1”、“v2”、“v3”};
字符串[]构造函数args={“a”、“b”、“c”};
Map Map=newhashmap();
for(int i=0;i
您可以通过
map.get(name)
使用变量名称访问变量

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");

有关ASM的更多信息,请参见。

在纯Java中不可能做到这一点。您应该能够使用ASM或某些字节码操作库以某种方式实现它,但这并不值得。最好的方法是使用
Map
。请注意
Map
是一个接口,
HashMap
是它的实现

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");
String[] names = {"v1", "v2", "v3"};
String[] constructorArgs = {"a", "b", "c"};
Map<String, Vertex> map = new HashMap<String, Vertex>();
for (int i = 0; i < names.length; i++)
{
    map.put(names[i], new Vertex(constructorArgs[i]));
}

for (int i = 0; i < names.length; i++)
{
    Vertex v = map.get(names[i]);
    //do whatever you want with this vertex
}
String[]name={“v1”、“v2”、“v3”};
字符串[]构造函数args={“a”、“b”、“c”};
Map Map=newhashmap();
for(int i=0;i
您可以通过
map.get(name)
使用变量名称访问变量

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");


有关ASM的更多信息,请参见。

Nope,使用数组或
Map
。可以帮助吗?@Mateusz不同,我想创建非变量对象。Nope,使用数组或
Map
。可以帮助吗?@Mateusz不同,我想创建非变量对象。但它将如何为对象赋值。假设我想像这样使用
v3
:v3.somevariableafter之后,我想使用like
v0.adjaciences=new Edge[]{new Edge(v1,distance[0][1])
@user2908533,你必须在一个循环中再做一次,最好与填充地图的循环相同。名为
“v”+I
的对象的相邻对象是名为
“v+(I+1)的对象
。您应该检查
Map#get
的返回值是否为null。如果没有找到映射,它将返回
null
。感谢您的回答,它正在工作,但它将如何为对象赋值。假设我想像这样使用
v3
:v3.somevariable之后我想使用like
v0.adjacencies=new Edge[]{new Edge(v1,distance[0][1])
@user2908533您必须在循环中再次执行此操作-最好与填充地图的循环相同。名为
“v”+i
的对象的相邻对象是名为
“v”+(i+1)的对象
。你应该检查
Map#get
的返回值是否为null。如果没有找到映射,它将返回
null
。感谢你的回答,它正在工作,之后我想使用像
v0.appachencies=new Edge[]{new Edge(v1,distance[0][1])
你必须像
Map.get(“v0”)那样做.adjacencies=…
。如果不操纵字节码,就真的无法实现您想要的。在这之后,我想使用like
v0.adjacencies=newedge[]{newedge(v1,distance[0][1])
您必须像map.get(“v0”)那样做.adjacences=…
。如果不操纵字节码,就无法实现您想要的结果。
    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");