我有一个很好的问题-创建电话簿-包含联系人列表。
正如电话簿所说,


联系人应始终排序。(按姓名)
可以星标确定
联系人,因此他们必须高于其他所有联系人(*联系人
在创建联系人时排序)

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()查找对象

07-25 22:46