我正在创建一个由多位作者撰写的文章数据库,因此我有两个类:作者和文章。 文章的构造函数是
Article(String title, String venue, Author[] authors, long year).
Author对象包含一个String,其中包含作者的名称和他编写的文章的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方法: public boolean hasArticle(Article a){ return articles.contains(a); }
我按照建议修改了equals方法,但现在的问题是我为作者提供了适当数量的文章,但第一个是重复的。我做错了什么?我是否应该使用Article.equals()方法?
答案 0 :(得分:2)
您需要覆盖Author.equals()
以便为不同但等效的true
个实例返回Author
。
答案 1 :(得分: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代码。
您还需要确保不要将文章添加到作者已添加的文章列表中。