【问题标题】:ArrayList.add() not adding, not returning errorsArrayList.add() 不添加,不返回错误
【发布时间】:2015-04-16 22:52:04
【问题描述】:

对于我的 AP CompSci 课程,我们正在制作一个“联系人”程序来模拟使用虚拟电话簿。主类Contacts如下。

public class Contacts extends ArrayList<Contact>
{
    private ArrayList<Contact> contacts = new ArrayList<Contact>(); 

    @Override
    public boolean add(Contact c)
    {
        contacts.add(c);
        Collections.sort(contacts);
        return true;
    }

    public ArrayList<Contact> search(String name)
    {
        ArrayList<Contact> temp = new ArrayList<Contact>();
        for(int i = 0; i<=contacts.size(); i++)
        {
            if(contacts.get(i).getName().equals(name))
            {
                temp.add(new Contact(name));
            }
        }

        return temp;
    }

}

如您所见,它扩展了ArrayList&lt;Contact&gt;。 Contact 是一个简单的对象,由一个 String name 和一个 7-integer int num 组成。问题出在ContactsFactory 类中,我在其中循环一个文本文件以创建一个巨大的名称数组列表。

public class ContactsFactory {
    public static Contacts getContacts() throws FileNotFoundException {
        String path = System.getProperty("user.dir");
        Scanner s = new Scanner(new File(path + "\\src\\names.txt"));
        Contacts contacts = new Contacts();
        do {
            contacts.add(new Contact(s.next()));
        } while (s.hasNext());

        s.close();

        //print size to see anything added. It returns 0.
        System.out.println(contacts.size());
        return contacts;
    }
}

但是,当我为每个名称实现add() 方法时,它不仅似乎没有添加任何内容,而且没有返回任何错误。更有趣的是,当我在每次迭代后放置一个打印语句时发现,s.next() 不是空字符串。但是字符串(从names.txt 传输时没有遇到任何问题)没有添加到contacts,因此,ArrayList 最终为空,size() 为 0。

我认为错误可能出在被覆盖的 Contacts.add() 方法中,但我无法弄清楚任何事情。有人可以帮我吗?提前致谢。

【问题讨论】:

  • 尝试扩展AbstractList 并将getsetaddsize 方法委托给您的contacts 变量。这样你就不需要例如担心自己提供Iterator

标签: java arraylist overriding add contacts


【解决方案1】:

我想知道您为什么要扩展 ArrayList 并另外保留 ArrayList 的另一个副本。除了覆盖的add(和来自azurefrog 的回答中的size)之外,ArrayListList 接口还提供了许多其他方法 - 而不是覆盖所有这些方法并委托给内部列表,我会只需依赖这些方法并添加我需要的功能即可:

public class Contacts extends ArrayList<Contact>
{
    @Override
    public boolean add(Contact c)
    {
        boolean result = super.add(c);
        Collections.sort(this);
        return result;
    }

    public ArrayList<Contact> search(String name)
    {
        // ...
    }

}

这样你就有了一个成熟的ArrayList 并且可以根据你的需要扩展它。

另一种选择是,直接退出 extends 并自行实现联系人,利用内部列表作为存储而不直接公开它。

【讨论】:

    【解决方案2】:

    我认为您的设计有问题。 我认为你不应该扩展 ArrayList。

    因为当你这样做时,你的类是一个 ArrayList,而且你在你的类中创建了一个 ArrayList 对象。

    问题是,当您调用 size 时,会返回原始 ArrayList 的大小。由于您将元素添加到 ArrayList 中,因此原始元素仍然是空的。

    【讨论】:

      【解决方案3】:

      您应该使用委托或继承,在这种情况下,您将两者混合使用。

      要么实现java.util.List&lt;Contact&gt;(而不是扩展ArrayList)并将每个方法调用委托给委托(类变量contacts)

      删除类变量 contacts 并在您的 add 方法中使用 super.add()(而不是 contacts.add())和 this 而不是联系人上的所有其他引用

      【讨论】:

        【解决方案4】:

        我不确定您是如何阅读文件的,但我似乎做得很好。为了访问工厂中联系人对象的大小,您需要调用内部 ArrayList 实例变量的“size”方法,而不是调用“联系人”对象本身。为了正确应用 'size' 方法,您可能还需要重写此方法('size')。

        除此之外,添加和检索似乎没问题。同时查看控制台输出!

        public class Contacts extends ArrayList<Contact>
        {
            private List<Contact> contacts = new ArrayList<Contact>(); 
        
            @Override
            public boolean add(Contact c)
            {
                contacts.add(c);
                //Collections.sort(contacts);
                return true;
            }
        
            @Override
            public String toString()
            {
                return contacts.toString();
            }
        
            public List<Contact> getMyList()
            {
                return this.contacts;
            }
            public static void main(String[] args)
            {
                Contacts test=ContactsFactory.getContacts();
                System.out.println(test.toString());
            }
        }
        
        class ContactsFactory {
        
        
            public static Contacts getContacts()  {
        
                String[] names={"A","B","C","D"};
                int i=0;
        
                Contacts contacts = new Contacts();
                do {
                    System.out.println("Adding: "+names[i]);
                    contacts.add(new Contact(names[i]));
                    i++;
                } while (i<names.length);
        
        
        
                //print size to see anything added. It returns 0.
                System.out.println(contacts.getMyList().size());
                return contacts;
            }
        }
        
        class Contact
        {
            String name;
            @Override
            public String toString()
            {
                return "Contact: "+this.name;
            }
            public Contact(String val)
            {
                this.name=val;
            }
        }
        

        输出:

        Adding: A
        Adding: B
        Adding: C
        Adding: D
        4
        [Contact: A, Contact: B, Contact: C, Contact: D]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-23
          • 2021-08-09
          • 2016-05-12
          • 1970-01-01
          • 2011-09-30
          • 2018-05-23
          • 2016-05-29
          相关资源
          最近更新 更多