0

好的,所以我有以下代码:

Random rnd = new Random();
int i = 0;
while(i<1000) {
  String name = "event" + i;
  Event name = new Event(rnd.nextInt(100000)); //ERROR duplicate variable
  SimEngine.getScheduler().addEventToQueue(event);
  i++;
}
System.out.println(SimEngine.getScheduler().getQueue().iterator());

我知道两次声明名字是没有意义的,但我希望你能看到我想要做什么。因为我想要名称为 event1、event2、event3 等的 Event 对象。

我怎样才能让它让我使用字符串名称作为事件对象的名称?

4

4 回答 4

6

因为我想要名称为 event1、event2、event3 等的 Event 对象。

对象(通常)没有名称。变量有名字。不过,您真的不想使用带有名称等的event1变量event2

在这种情况下,如果您确实需要通过索引访问事件,则基本上应该使用数组。

Event[] events = new Event[1000];
for (int i = 0; i < 1000; i++) {
    events[i] = new Event(rnd.nextInt(100000));
    SimEngine.getScheduler().addEventToQueue(events[i]);
}

当然,如果您以后不打算使用该变量,那么无论如何这都是没有意义的,而且您也可以:

for (int i = 0; i < 1000; i++) {
    SimEngine.getScheduler().addEventToQueue(new Event(rnd.nextInt(100000));
}

如果这种特定类型的类确实有一个与每个实例关联的名称,我怀疑你需要将该名称传递给构造函数。

于 2012-11-10T15:21:54.367 回答
4

您不能1,但可以使用 aMap<String,Event>代替,并将变量名作为键,将对象作为值。

要访问“变量” - 您可以使用Map.get()Map.put()。类似于以下内容:

Map<String,Event> varaibles = new HashMap<String,Event>();
variables.put("event" + i, new Event(...)) //setting new "varaibles"
Event myEvent = variables.get(someString); //getting the objects assigned to a "variable"

(1) 可以部分通过反射来完成。如果您已经拥有变量(不声明新变量) - 您可以使用反射 API 通过变量名称访问变量,但不建议这样做。

于 2012-11-10T15:22:17.253 回答
1

使用数组或哈希表。

Map<String, Event> m = new HashMap<String, Event>();

您不能(至少不容易)在运行时设置变量名。

于 2012-11-10T15:22:44.740 回答
1

您不必为每个对象命名即可使用它们中的一系列,这就是数据结构的用途,例如数组或映射,因此您可以执行类似的操作

SimEngine.getScheduler().addEventToQueue(new Event(rnd.nextInt(100000)));

那是你要的吗?

于 2012-11-10T15:24:07.373 回答