对于我的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()
方法中,但我还没有能够解决任何问题。有人可以帮我吗?提前谢谢。
答案 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]