Java 无法修改ArrayList元素

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

我正在创建一个由多个作者撰写的文章数据库,所以我有两个类: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);
                }
            }
        }

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()
(a
string
)永远不会等于
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()
(a
string
)永远不会等于
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:那是因为作者在他们的文章列表中已经有了这篇文章。对不起,你需要确保你要添加的文章不在列表中,而它(我现在理解你的代码)已经在列表中了。也就是说,每个作者都从一篇文章开始。当找到那篇文章时