0

私は複数の著者によって書かれた記事のデータベースを作成しているので、著者と記事の2つのクラスがあります。Articleのコンストラクターは

        Article(String title, String venue, Author[] authors, long year).

Authorオブジェクトには、作成者の名前が記載された文字列と、作成者が作成した記事のArrayListが含まれています。

だから、私は記事の配列を持っています、そして私は著者のArrayListを作成し、彼らが書いたすべての記事を追加しようとしています。

これは私のコードです:

for(int i=0; i<allarticles.length; i++) {
            Author[] tempauthors = allarticles[i].getAuthors();
            for (int j=0; j<tempauthors.length; j++) {
                Author tempauthor = tempauthors[j];
                if (authors.contains(tempauthor)) {
                    Author oldAuthor = authors.get(authors.indexOf(tempauthor));
                    if (!oldAuthor.hasArticle(allarticles[i]))
                        oldAuthor.addArticle(allarticles[i]);
                } else {
                    if (!tempauthor.hasArticle(allarticles[i]))
                        tempauthor.addArticle(allarticles[i]);
                    authors.add(tempauthor);
                }
            }
        }

そして、これがhasArticleメソッドです。publicboolean hasArticle(Article a){return articles.contains(a); }

提案されたようにequalsメソッドを変更しましたが、問題は、適切な量の記事で著者を取得することですが、最初の記事が重複しています。私が間違っていることは何ですか?Article.equals()メソッドもovverrideする必要がありますか?

4

2 に答える 2

2

異なるが同等のインスタンスAuthor.equals()に戻るには、オーバーライドする必要があります。trueAuthor

于 2012-05-06T11:49:21.790 に答える
2

Authorクラスに、名前が同じであるAuthorオブジェクトのインスタンスごとに同じAuthorオブジェクトを返す独自のメカニズムがない限り、コードは正しく機能しています。

contains()メソッドは、名前で作成者を参照していることを「認識」しません。特定の作成者オブジェクトがArrayListにあるかどうかを確認したことだけを認識します。

contains()メソッドは、equals(Object a)メソッドを使用してオブジェクト全体を比較します。equals()メソッドが等しいと言っている場合に限り、2つの異なるオブジェクトは等しいです。明示的なequals()メソッドのないクラス(Objectから継承されたもの、またはクラスが拡張する別のクラスを除く)の場合、アドレス(ポインター...)が使用されます。

したがって、「equals()」の意味を定義する必要があります。あなたの場合、作者の名前が等しい場合、2つのオブジェクトは等しくなります。あなたの場合、それはequals()がこのメソッドであることを意味します-

public boolean equals(Object a) {
  if (! (a instanceof Author))
    return false;

  return this.getname().equals(((Author) a).getname());
}

また、コードにファンキーなロジックが含まれているようです。著者が持っている既存の記事に新しい記事を追加したいとします。したがって、その作成者の既存のエントリ(ArrayListのindexOf()メソッド)を見つけ、そのエントリを取得し(get()メソッド...)、すでにArrayListにあるAuthorオブジェクトに記事を追加する必要があります。

これを行うには、次のことを行う必要があります

Author oldAuthor = authors.get(authors.indexOf(tempauthor));
oldAuthor.addArticle(allarticles[i]);

あなたが持っているremove/addArticle/removeコードの代わりに。

また、すでに追加した著者の記事のリストに記事を追加していないことを確認する必要があります。

于 2012-05-06T12:00:43.447 に答える