我有一个测试输入文件,其中针对不同场景应创建不同数量的对象。
例如:对于一个测试输入,它们必须是3个要创建的对象,名称为v0,v1,v2,而对于其他测试输入,它们必须是5个要创建的对象,名称为v0,v1,v2,v3,v4。
对于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(对象的数量)这样的动态:
for(int i=0;i<k;i++){
Vertex vi= new Vertex("str");
}
答案 0 :(得分:10)
您需要的是Map <String, Vertext>
String arr = new String[]{"a", "b", "c", "d", "e", "f"};
Map<String, Vertex> map = new HashMap<>();
for(int i = 0; i < arr.length; i++) {
map.put("v" + i, new Vertext(arr[i]));
}
然后你可以使用他们的名字来检索对象,例如,如果你需要v3
,你可以写一下:
Vertex v3 = map.get("v3"); // returns the object holding the String "d"
System.out.println(v3.somevariable);
如果somevariable
持有你在构造函数中传递的字符串,那么print语句的输出将是
d
答案 1 :(得分:3)
用普通的Java做这件事是不可能的。您应该能够以某种方式使用ASM或某些字节代码操作库来实现它,但它并不值得付出努力。最好的方法是使用Map
。请注意,Map
是一个接口,HashMap
是其实现。
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
}
您可以通过map.get(name)
使用他们的名字访问变量。
有关ASM的更多信息,请参阅this answer。
答案 2 :(得分:2)
您可以使用Map
,其中密钥为String
(名称),值为Vertex
。
E.g:Map<String, Vertex>
然后你可以这样做:
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();