1

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

例如:对于一个测试输入,它们必须是 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");
}
4

3 回答 3

12

你需要的是一张地图<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
于 2013-10-22T19:16:19.150 回答
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 的更多信息,请参阅此答案

于 2013-10-22T19:28:51.217 回答
2

您可以使用 a Map,其中键是String(名称),值是Vertex.

例如: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();
于 2013-10-22T19:18:04.187 回答