gpt4 book ai didi

java - 电话簿编程 - TreeSet 或 HashSet

转载 作者:行者123 更新时间:2023-11-29 08:01:07 26 4
gpt4 key购买 nike

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

  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. contains 找不到该条目,怎么了?我确实尝试在 Contact 上放置一个 equals 和一个 hashcode,显然,如果存在 Comparator/Comparable,则只会调用 compare*。
  2. 在这里使用 TreeSet 是否公平,还是应该使用任何其他数据结构?例如。 HashSet 然后转换为 TreeSet?
  3. contains() 甚至不比较映射中的所有条目,它只是与 C、Ma 和 Ta 条目进行比较。为什么会这样?

问题按先后顺序排列。我感谢所有的答案,但这确实是一个完整的测试用例,所以请在提供答案之前尝试运行 PhoneBook 一次。非常感谢。

最佳答案

这一行:

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

如果您将联系人与自身进行比较,则永远不会返回 0。因此该集合将无法找到具有 contains()

的对象

关于java - 电话簿编程 - TreeSet 或 HashSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14375853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com