2012-11-10 68 views
0

好了,所以我有下面這段代碼:在Java中使用字符串作爲名稱的對象

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對象的名稱?

回答

6

因爲我想與事件事件1名,事件2,對象EVENT3等

對象不(通常)有名字。變量有名字。不過,你真的不想擁有名稱爲event1event2等的變量。

在這種情況下,如果您確實需要通過索引訪問事件,則基本上應該使用數組。

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)); 
} 

如果這種特殊類的確實有一個與每個實例關聯的名稱,您需要將該名稱傳遞給構造函數,我懷疑。

+0

非常感謝!這兩種解決方案都很有幫助,但由於我以後不打算使用每個Event對象,所以我將採用第二種方法。 :) – DSF

4

您不能,但您可以使用Map<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)它可以部分地與reflection完成。如果你已經有了變量(而不是聲明新變量) - 你可以通過使用反射API的名字來訪問一個變量,但它是不受監督的。

1

使用數組或哈希表。

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

您不能(至少不容易)在運行時設置變量名稱。

1

你不必命名每個對象以使用一個系列當中,這就是數據結構是,前陣列或映射 所以你可以做這樣的事情

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

是什麼你要?

相關問題