3

ループで簡単に取得できる命名パターンを使用して、多数のオブジェクトを作成する必要があります。このように変数からオブジェクト名を読み取る方法はありますか?

String Var = "ObjectName";
ClassName Var = new ClassName();

オブジェクトに変数名を割り当てる必要はありません。割り当て時にオブジェクトから名前を取得するだけです。

4

3 に答える 3

22

あなたの言葉の選択は、変数とオブジェクトがどのように機能するかを完全に理解していないことを示しており、Java を使用するにはそれを修正する必要があります。

私が書く場合:

Item myItem = new Item();

新しいオブジェクトを作成し、そのオブジェクトを指す変数を定義します。

オブジェクトには名前がありません(実行時に割り当てられる番号である ID があります。ほとんどのプログラマーはそれを無視できます)。

変数の名前はmyItemです。変数はオブジェクトを指します。後で、別のオブジェクトを指している可能性があります。オブジェクトは存在し続けますが、変数はスコープから外れて存在しなくなる可能性があります。

「それは重要ではない。『オブジェクトの名前』と言えば、『オブジェクトを指す変数の名前』を意味する」と言うかもしれません。

ただし、多くのオブジェクトが複数の変数によってポイントされるため、これは重要です。

Item myItem = new Item();
Item yourItem = myItem;
// both variables point to the same object. Neither variable is "more" the
// owner of the object than the other.

...そして、多くのオブジェクトは変数によって直接指されません。

myList.append(new Item()); 
// you can't get at this new object using a direct variable.

Java (およびほとんどの主流言語) では、実行時に変数名を作成できません。存在する唯一の変数名は、文字通りソース コードにあるものです

したがって、次のように機能するものはありません。

int number = 1;
Cell cell$number = new Cell(); // can't be done!
Cell currentCell = cell1; 

また、ランタイム データに基づいて名前で変数にアクセスすることもできません。したがって、次のように機能するものはありません。

Cell cell1 = ...;
int number = 1;
Cell currentCell = cell$number; // can't be done!

これは、コンパイラがコードに関する特定のことを検証できるため、良いことです。

一部の言語では、eval() を使用してこのようなことを実現できる可能性がありますが、そこから 1 マイルも実行する必要があります。

これは、次のようなコードを書いている場合のヒントです。

 Cell cell0 = new Cell(...);
 Cell cell1 = new Cell(...);
 ...
 Cell cell99 = new Cell(...);

...それなら、あなたは何か間違ったことをしています。うまくいくかもしれませんが、スケールが悪いです。これをループに入れる方法はありません。(心配しないでください。私たちのほとんどは、プログラミングを始めたときにこの問題に遭遇しました)。

代わりに配列を使用した場合:

 Cell[] cells = new Cell[];
 cells[0] = new Cell(...);
 cells[1] = new Cell(...);
 ...
 cells[99] = new Cell(...);

次に、代わりにループを使用できます。

 for(int i = 0; i<100; i++) {
     cells[i] = new Cell(...);
 } 

配列は、最も単純な「コレクション」オブジェクトです。ほとんどのニーズに合わせて、セット、リスト、マップ、およびより高度なコレクションのホストもあります。

文字列をキーとしてオブジェクトを保存およびアクセスしたいようです。これを行う方法は、マップを使用することです。

Map<String,Cell> myMap = new TreeMap<String,Cell>();

myMap.put("AA", new Cell(...));
myMap.put("AB", new Cell(...));

...

Cell currentCell = myMap.get("AA");

Mapインターフェースです。インターフェイスTreeMapの実装を提供する 1 つのクラスにすぎません。標準 JRE によって提供されるMapのさまざまな実装について読んでください。Map

キーは である必要はありませんString。を実装equals()するものはすべてキーとして使用できます。

これを使用して:

for(char c = 'A'; c <= 'L'; c++) {
   for(char d = 'A'; d<= 'L'; d++) {
       myMap.put("" + c + d, new Cell(...));
   }
}

ただし、グリッドが必要だと言ったので、2D 配列を使用して、必要に応じて数値座標を文字付きグリッド参照との間で変換する方がよいでしょう。「2D 配列 Java」を Google で検索すると、多くの例が見つかります。

Cell[][] cells = new Cell[12][12];
for(int x=0; x<12; x++) {
   for(int y=0; y<12; y++) {
       Cell cell = new Cell();
       cell.setName( "" + ('A' + x) + ('A' + y)); // perhaps
       cells[x][y] = cell;
   }
}

標準の JRE 以外にも、. の実装は他にもたくさんありMapます。たとえば、Spring は、オブジェクトが Redis データベースに格納される DefaultRedisMap を提供します。

より一般的には、ここで非常に基本的な質問をしました。まともな Java の本でCollections APIの章を読むべきです。

于 2013-10-25T12:58:59.330 に答える
2

あなたが何を望んでいるのかはまったく明らかではありません。名前でオブジェクトを検索したい場合は、マップを使用できます

例:

Map<String, Object> map = new HashMap<String, Object>();

String objectName = ...// get name of object
Object object = ...// get object
map.put(objectName, object);

次に、取得できます。

Object obj = map.get(objectName);
于 2013-10-25T13:01:49.980 に答える
1

入手しやすい?配列を調べましたか?文字列を使用する場合は、文字列配列で十分です。char 配列と int 配列もあります。

    String[] myStringArray = new String{"hello", "world"};
    int[] myIntArray = new int{1, 2, 3, 6};

配列とその使用法を読むことをお勧めします。これで問題が解決する可能性があると思います。

于 2013-10-25T12:54:30.167 に答える