1

多くの場所を見てきましたが、ほとんどの arraylist の例では "String" を要素として使用していますが、オブジェクトを使用している場所を見つけるのは困難です。

私が本のコレクションに取り組んでいて、著者オブジェクトがあるとしましょう:

class Author {
  String name;
  <other data>;
  int bookCount;

  public Author(String n) {
     name = n;
  }

  public boolean equals(Author other) {
     if (other.name.equals(name)) { return true;}
     return false;
  }
}

そこで、arrayList としてインスタンス化された作成者のリストを作成します。

Arraylist<Author> writers;

したがって、著者が存在するかどうかを確認し、存在しない場合は新しいエントリを作成するか、存在する場合は bookCount をインクリメントしたいと考えています。Author の名前に equals メソッドを記述して (上記のように)、次のようなことを行うことができます。

bookAuthor = "James Gosling"; // normally an input
Author current = new Author(bookAuthor);
if (!writers.contains(current)) {
    writers.add(current);
} else {
    writers.get(writers.indexOf(current)).bookCount++;
}

私はこれがうまくいくと信じています.比較後にそれらを捨てるためだけに多数のオブジェクトを作成するのは好ましくないと思います. (すごく高い)。

これは、この場合でも名前のみのコンストラクターを使用できることを意味しますが、Author を 2 回作成する必要があります。私が考えることができる唯一の他の方法は、ArrayList から継承し、Contains と indexOf をオーバーライドする新しいクラスを作成することです。これは多くのオーバーヘッドのように思えますが、新しいクラスでも equals や hashCode などをオーバーライドする必要がありますか?

インライン関数を提供する方法や、オブジェクトのコンテナーをより簡単に使用できるようにする方法はありませんか? 私は次のようなことができることを望んでいました:

Arraylist<Author> {equals(String x) { if (x = this.name) { return true;} return false; } writers;

if (!writers.contains(bookAuthor)) {
    writers.add(new Author(bookAuthor,dbconn);
} else {
    writers.get(writers.indexOf(bookAuthor)).bookCount++;
}

しかし、もちろん、contains と indexOf には String シグネチャがありません。これをインラインに配置することは、新しいクラスを作成することとほぼ同じ量の作業です。

4

4 に答える 4

0

私は、ある程度前に同様の状況にありましたが、次のような問題を解決しました。

  1. 各作成者に ID (または一意の識別子) を割り当てます。名前で検索するのはやっぱり時間がかかる
  2. すべてのデータを : にロードします。これは、毎回データベースをチェックするよりも、すべてのHashMap<Long, Author>をチェックする方が速いためです。HashMapAuthors
  3. O(1) では、Author好きなオブジェクトにアクセスできますhashMap.get(ID)
于 2013-04-06T11:34:17.300 に答える