我有一个很好的问题-创建电话簿-包含联系人列表。
正如电话簿所说,
联系人应始终排序。(按姓名)
可以星标确定
联系人,因此他们必须高于其他所有联系人(*联系人
在创建联系人时排序)
class PhoneBook{
//require an always sorted d.s
TreeSet<Contact> contacts = new TreeSet<Contact>();
@Override
public String toString() {
return "PhoneBook [contacts=" + contacts + "]";
}
public boolean addContact(Contact contact){
//validate before adding the contact.
return contacts.add(contact);
}
}
class Contact implements Comparable<Contact>{
String name;
int phoneNo;
Date timeAdded;
boolean starContact;
public Contact(String name, int phoneNo, Date timeAdded, boolean starContact) {
super();
this.name = name;
this.phoneNo = phoneNo;
this.timeAdded = timeAdded;
this.starContact = starContact;
}
@Override
public int compareTo(Contact otherContact) {
if(this.starContact && otherContact.starContact){
return this.timeAdded.before(otherContact.timeAdded)?-1:1; //impossible to add 2 contacts at the same time
}else if(this.starContact){
return -1;
}else if(otherContact.starContact){
return 1;
}else{
//simple Contacts
return this.name.compareTo(otherContact.name);
}
}
@Override
public String toString() {
return "\nContact [name=" + name + ", timeAdded=" + timeAdded
+ ", starContact=" + starContact + "]";
}
}
测试代码
public class MobilePhoneBookDemo {
/**
* @param args
*/
public static void main(String[] args) {
PhoneBook phoneBook = new PhoneBook();
Contact frnd1 = new Contact("Z",56,new Date(),false);
phoneBook.addContact(frnd1);
Contact frnd2 = new Contact("A",3,new Date(),false);
phoneBook.addContact(frnd2);
Contact frnd3 = new Contact("C",30,new Date(),false);
phoneBook.addContact(frnd3);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Contact ta = new Contact("Ta", 5, new Date(), true);
phoneBook.addContact(ta);
Contact ma = new Contact("Ma", 31, new Date(), true);
phoneBook.addContact(ma);
Contact baba = new Contact("Baba", 300, new Date(), true);
phoneBook.addContact(baba);
//change the priority later for one of my friends.
System.out.println(phoneBook);
frnd1.starContact = true;
System.out.println(phoneBook.contacts.contains(frnd1));
if(phoneBook.contacts.remove(frnd1)){
System.out.println("removed");
phoneBook.contacts.add(frnd1);
}
System.out.println(phoneBook);
}
}
面临的问题:
包含不再找到该条目,这是什么不对?
我确实尝试过在Contact上放置一个等于和一个哈希码,显然,如果存在Comparator / Comparable,则只调用compare *。
在这里使用TreeSet是否公平,还是应该使用任何其他数据结构?
例如。然后将HashSet转换为TreeSet?
contains()甚至没有对映射中的所有条目进行比较,它只是与C,Ma和Ta条目进行了比较。怎么会这样
根据顺序询问优先级。
我很感谢所有答案,但这确实是一个完整的测试用例,因此请在提供答案之前尝试运行一次PhoneBook。非常感谢。
最佳答案
这行:return this.timeAdded.before(otherContact.timeAdded)?-1:1;
如果将联系人与自身进行比较,则永远不会返回0。因此,该集合将无法使用contains()
查找对象