私は良い問題を抱えています -連絡先のリストを含む電話帳を作成します。電話帳にあるように、
- 連絡先は常にソートされます。(名前順)
特定の連絡先にスター マークを付けることができるため、残りの連絡先よりも上にある必要があります。
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 に equals と hashcode を配置しようとしましたが、Comparator/Comparable が存在する場合、compare* のみが呼び出されるようです。
- ここで TreeSet を使用するのは公正ですか、それとも他のデータ構造を使用する必要がありますか? たとえば。HashSet から TreeSet に変換しますか?
- contains() は、マップ内のすべてのエントリを比較するのではなく、C、Ma、および Ta エントリと比較するだけです。それはなぜですか?
順番に質問優先。すべての回答に感謝しますが、これは実際には完全なテスト ケースであるため、回答を提供する前に一度だけ PhoneBook を実行してみてください。どうもありがとう。