java无法修改ArrayList元素
我正在创建一个由多个作者撰写的文章数据库,所以我有两个类:Author和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方法: 公共物品(a条){ 归还物品。包含(a); }
我按照建议修改了equals方法,但现在的问题是,我得到了数量合适的文章,但第一篇是重复的。我做错了什么?我是否应该跳过这篇文章。equals()方法
# 1 楼答案
您需要重写
Author.equals()
以返回不同但等效的Author
实例的true
# 2 楼答案
除非Author类有自己的机制为名称相同的Author对象的每个实例返回相同的Author对象,否则代码工作正常
contains()方法不“知道”您是按名称引用作者,它只知道您询问了特定的author对象是否在ArrayList中
contains()方法使用其equals(object a)方法比较整个对象。两个不同的对象相等,当且仅当equals()方法表示它们相等时。对于没有显式equals()方法的类(继承自Object或类扩展的其他类除外),地址(指针…)使用
因此,您必须定义“equals()”的含义。在您的情况下,如果作者的姓名相等,则两个对象相等。在您的例子中,这意味着equals()是这个方法
您的代码中似乎也有一些古怪的逻辑。您希望将新文章添加到作者的现有文章中。因此,您需要找到该作者的现有条目(ArrayList中的indexOf()方法),获取该条目(get()方法…)然后将文章添加到ArrayList中已有的Author对象中
要做到这一点,您需要
而不是您拥有的remove/addArticle/remove代码
您还需要确保您没有将已添加的文章添加到作者的文章列表中