有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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


共 (2) 个答案

  1. # 1 楼答案

    您需要重写Author.equals()以返回不同但等效的Author实例的true

  2. # 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代码

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