ArrayList.add()不添加,不返回错误

时间:2015-04-16 22:52:04

标签: java arraylist override add contacts

对于我的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<Contact>。 Contact是一个简单的对象,由String name和7-integer int num组成。问题在于类ContactsFactory,我在其中循环一个文本文件以创建一个巨大的名称ArrayList。

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()方法时,它不仅似乎没有添加任何内容,而且它不会返回任何错误。更有趣的是,正如我在每次迭代后放置一个print语句时发现的那样,s.next()不是空字符串。但是String(它没有遇到从names.txt转移的问题)没有添加到contacts,因此,ArrayList以size()为0结束为空。

我认为错误可能在被覆盖的Contacts.add()方法中,但我还没有能够解决任何问题。有人可以帮我吗?提前谢谢。

4 个答案:

答案 0 :(得分:2)

我想知道为什么要延长ArrayList并另外保留ArrayList的另一个副本。除了被覆盖的add(以及来自azurefrog的答案的size)之外,ArrayList以及List界面还提供了许多其他方法 - 而不是覆盖所有这些并委托给内部列表,我只依靠这些方法并添加我需要的功能:

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,然后自行实施联系人,将内部列表用作存储空间,而不是直接公开。

答案 1 :(得分:0)

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

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

问题是,当你调用size时,会返回原始的ArrayList的大小。由于您已将元素添加到ArrayList,原始文件仍为空。

答案 2 :(得分:0)

您应该使用委托或继承,在这种情况下,您将它们混合起来。

实现java.util.List<Contact>(而不是扩展ArrayList)并将每个方法调用委托给委托(类变量联系人)

OR

删除类变量contacts并在添加方法(而非super.add())和contacts.add()中使用this,而不是在联系人上使用其他所有参考

答案 3 :(得分:0)

我不确定你是怎么看文件的,但我似乎做得很好。要访问工厂中联系人对象的大小,您需要调用&#39; size&#39;内部ArrayList实例变量的方法,而不是调用&#39;联系人&#39;对象本身。为了正确应用“尺寸”&#39;方法,也许您需要覆盖此方法(&#39; size&#39;)。

除此之外,添加和检索似乎很好。查看控制台输出!

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]
相关问题