无法修改ArrayList元素

时间:2012-05-06 11:47:04

标签: java arraylist

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

        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()方法?

2 个答案:

答案 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代码。

您还需要确保不要将文章添加到作者已添加的文章列表中。