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

名前を2回宣言しても意味がないことは知っていますが、私がやろうとしていることを理解していただければ幸いです。event1、event2、event3などの名前のEventオブジェクトが必要なためです。

文字列名を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はできませんが、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)部分的にリフレクションで行うことができます。変数がすでにある場合(新しい変数を宣言していない場合)-リフレクション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 に答える