Java 无法修改ArrayList元素
我正在创建一个由多个作者撰写的文章数据库,所以我有两个类:Author和Article。 项目的构造函数是Java 无法修改ArrayList元素,java,arraylist,Java,Arraylist,我正在创建一个由多个作者撰写的文章数据库,所以我有两个类:Author和Article。 项目的构造函数是 Article(String title, String venue, Author[] authors, long year). Author对象包含一个带有作者姓名的字符串和他所写文章的ArrayList 因此,我有一个文章数组,我试图创建一个作者数组列表,并添加他们所写的所有文章 这是我的代码: for(int i=0; i<allarticles.lengt
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);
}
}
}
for(int i=0;i您需要覆盖Author.equals()
以返回不同但等效的Author
实例的true
。您需要覆盖Author.equals()
为不同但等效的Author
实例返回true
。除非Author类有自己的机制为名称相同的Author对象的每个实例返回相同的Author对象,否则代码工作正常
contains()方法不“知道”您是按名称引用作者,它只知道您询问了特定的author对象是否在ArrayList中
contains()方法使用其equals(object a)方法比较整个对象。两个不同的对象相等,当且仅当equals()方法表示相等时。对于没有显式equals()方法的类(从对象继承的类或类扩展的另一个类除外),使用地址(指针…)
因此,您必须定义“equals()”的含义。在您的示例中,如果作者的姓名相等,则两个对象相等。在您的示例中,这意味着equals()就是此方法--
您的代码中似乎还有一些古怪的逻辑。您希望将新文章添加到作者现有的文章中。因此,您需要找到该作者的现有条目(ArrayList中的indexOf()方法),获取该条目(get()方法…),然后将文章添加到ArrayList中已有的author对象中
要做到这一点,您需要
Author oldAuthor = authors.get(authors.indexOf(tempauthor));
oldAuthor.addArticle(allarticles[i]);
而不是您拥有的remove/addArticle/remove代码
您还需要确保没有将文章添加到已添加的作者文章列表中。除非author类有自己的机制为名称相同的author对象的每个实例返回相同的author对象,否则代码工作正常
contains()方法不“知道”您是按名称引用作者,它只知道您询问了特定的author对象是否在ArrayList中
contains()方法使用其equals(object a)方法比较整个对象。两个不同的对象相等,当且仅当equals()方法表示相等时。对于没有显式equals()方法的类(从对象继承的类或类扩展的另一个类除外),使用地址(指针…)
因此,您必须定义“equals()”的含义。在您的示例中,如果作者的姓名相等,则两个对象相等。在您的示例中,这意味着equals()就是此方法--
您的代码中似乎还有一些古怪的逻辑。您希望将新文章添加到作者现有的文章中。因此,您需要找到该作者的现有条目(ArrayList中的indexOf()方法),获取该条目(get()方法…),然后将文章添加到ArrayList中已有的author对象中
要做到这一点,您需要
Author oldAuthor = authors.get(authors.indexOf(tempauthor));
oldAuthor.addArticle(allarticles[i]);
而不是您拥有的remove/addArticle/remove代码
您还需要确保没有将文章添加到您已经添加的作者的文章列表中。我尝试了:public boolean equals(author a){返回this.getName().equals(a);}但它不起作用。@tonydanza:那是因为getName()
(astring
)永远不会等于a
(一个作者
)。另外,你需要重写equals()
,它接受对象
。明白了,但仍然不起作用。我的方法是公共布尔等于(对象a){Author aut=(Author)a;返回这个.getName().equals(aut.getName());}
但我发现所有作者都有两篇重复的文章,比如作者x:article“Title1”,article“Title1”。@SLaks:逻辑也很糟糕。即使修复了equals()方法,代码仍然会被破坏。事实上,修复equals()方法会破坏代码——列表中的上一个Author对象现在可以删除,因为它可以与进行比较。我尝试了:public boolean equals(Author a){返回this.getName().equals(a);}但它不起作用。@tonydanza:这是因为getName()
(astring
)永远不会等于a
(一个作者
)。另外,你需要重写equals()
,它接受对象
。明白了,但仍然不起作用。我的方法是公共布尔等于(对象a){Author aut=(Author)a;返回这个.getName().equals(aut.getName());}
但我发现所有作者都有两篇重复的文章,比如作者x:article“Title1”,article“Title1”。@SLaks:逻辑也很糟糕。即使修复了equals()方法,代码仍然会被破坏。事实上,修复equals()方法会中断代码--现在可以删除列表中的上一个Author对象,因为它可以与进行比较。是否更改为停止删除现有的Author及其文章,而改为使用indexOf(tempauthor)找到现有条目,然后说现有条目中添加了文章?很抱歉,我没有给出完整的答案,但是@SLaks一直在引导您使用“修复等于方法”兔子洞。@tonydanza:那是因为作者在他们的文章列表中已经有了这篇文章。对不起,你需要确保你要添加的文章不在列表中,而它(我现在理解你的代码)已经在列表中了。也就是说,每个作者都从一篇文章开始。当找到那篇文章时