1

私は良い問題を抱えています -連絡先のリストを含む電話帳を作成します。電話帳にあるように、

  1. 連絡先は常にソートされます。(名前順)
  2. 特定の連絡先にスター マークを付けることができるため、残りの連絡先よりも上にある必要があります。

    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);
}

}

直面した問題:

  1. 含まれているエントリが見つかりません。何が問題なのですか? Contact に equals と hashcode を配置しようとしましたが、Comparator/Comparable が存在する場合、compare* のみが呼び出されるようです。
  2. ここで TreeSet を使用するのは公正ですか、それとも他のデータ構造を使用する必要がありますか? たとえば。HashSet から TreeSet に変換しますか?
  3. contains() は、マップ内のすべてのエントリを比較するのではなく、C、Ma、および Ta エントリと比較するだけです。それはなぜですか?

順番に質問優先。すべての回答に感謝しますが、これは実際には完全なテスト ケースであるため、回答を提供する前に一度だけ PhoneBook を実行してみてください。どうもありがとう。

4

3 に答える 3

4

この行:

return this.timeAdded.before(otherContact.timeAdded)?-1:1;

連絡先をそれ自体と比較しても、0 は返されません。したがって、セットはオブジェクトを見つけることができませんcontains()

于 2013-01-17T09:36:20.030 に答える
1

あなたは私を持っていました

連絡先は常にソートされます。(名前順)

順序が重要な場合は、TreeSet を使用してください。要素はさまざまな二分探索木に格納されます。これは、要素がデフォルトでソートされることを意味します。

一方、HashSet は、順序、並べ替え、または挿入順序さえも保証しません。


編集 - この方法で条件を記述し、より読みやすく、より堅牢にするようにしてください。条件の順序は、比較の優先順位です。

if(a != b){
    return a<b;
}

if(c != d) {
    return c<d;
}

//and so on.

return 0;
于 2013-01-17T09:32:59.170 に答える
0

解決策は簡単です。最初に削除してから、値を変更して再度追加します。最初に変更についてコメントしますが、多くの混乱があったため、変更した compareTo() も入れました。

//frnd1.starContact = true;
    System.out.println("Entry present>"+phoneBook.contacts.contains(frnd1));

    if(phoneBook.contacts.remove(frnd1)){
        System.out.println("removed");
        frnd1.starContact = true;
        phoneBook.contacts.add(frnd1);
    }


@Override
public int compareTo(Contact otherContact) {
    if(otherContact.phoneNo == this.phoneNo){
        return 0;
    }
    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);
    }
}
于 2013-01-18T08:07:41.877 に答える