0

我正在创建一个由多个作者撰写的文章的数据库,所以我有两个类:作者和文章。Article 的构造函数是

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

Author 对象包含一个带有作者姓名的字符串和一个他撰写的文章的 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 方法: public boolean hasArticle(Article a) { return items.contains(a); }

我按照建议修改了 equals 方法,但现在的问题是我得到的作者有适量的文章,但第一个是重复的。我做错了什么?我也应该覆盖 Article.equals() 方法吗?

4

2 回答 2

2

您需要覆盖Author.equals()以返回true不同但等效的Author实例。

于 2012-05-06T11:49:21.790 回答
2

除非 Author 类有自己的机制为名称相同的 Author 对象的每个实例返回相同的 Author 对象,否则代码可以正常工作。

contains() 方法不“知道”您指的是作者的名字,它只知道您询问了特定的 Author 对象是否在 ArrayList 中。

contains() 方法使用其 equals(Object a) 方法比较整个对象。两个不同的对象相等,当且仅当 equals() 方法说它们相等。对于没有显式 equals() 方法的类(继承自 Object 或您的类扩展的另一个类除外),将使用地址(指针 ...)。

因此,您必须定义“equals()”的含义。在您的情况下,如果作者的姓名相同,则两个对象是相同的。在您的情况下,这意味着 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 回答