当前位置: 首页 > 知识库问答 >
问题:

电话簿编程-TreeSet或HashSet

奚晟
2023-03-14

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

>

  • 联系人总是要分类的。(按姓名)
  • 可以用星号标记某些联系人,因此他们必须高于其他联系人。(按联系人创建时间排序*联系人)

    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*只会被调用

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

  • 共有3个答案

    庄子平
    2023-03-14

    解决方案很简单,首先删除,然后更改值,然后再次添加。我首先对修改进行评论,我还加入了修改后的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);
        }
    }
    
    卫志泽
    2023-03-14

    你让我在

    联系人总是要分类的。(按姓名)

    如果顺序很重要,请使用TreeSet。元素存储在各种二叉查找树中,这意味着默认情况下它们是排序的。

    另一方面,HashSet不保证任何顺序、排序甚至插入顺序。

    编辑——试着用这种方式写下你的条件,更具可读性,也更健壮。条件的顺序就是比较的优先顺序。

    if(a != b){
        return a<b;
    }
    
    if(c != d) {
        return c<d;
    }
    
    //and so on.
    
    return 0;
    
    翁和正
    2023-03-14

    这一行:

    返回this.timeAdded.before(其他Contact.time添加)?-1:1;

    如果您将联系人与其自身进行比较,则永远不会返回0。因此,集合将无法找到包含()的对象

     类似资料:
    • 我想从Android的联系簿中获得电话号码。我尝试了许多方法,但我无法获得电话号码。我有联系人姓名和状态,但当我尝试获取电话号码时,它不起作用。我的代码是。

    • 我是一名android应用程序开发人员。我只是想知道,我们能不能通过打电话或发短信给一个电话号码来获取这个号码的地理位置?就像在whatsapp中,我们可以看到这个人最后出现的时间,同样我们也可以得到最后出现的时间和最后的确切位置。这是在facebook messenger中找到的。我只是好奇是否可以只用一个电话号码。

    • 本文向大家介绍c#使用xamarin编写拨打电话程序,包括了c#使用xamarin编写拨打电话程序的使用技巧和注意事项,需要的朋友参考一下 xamarin 可以很方便的编写一个电话拨号程序,下面的代码是调用android系统的拨号功能,拨号前会给出一个提示信息。 callButton是一个用来拨号的按钮,我们使用它的点击事件来进行拨号,拨号前会有一个提示框 以上所述就是本文的全部内容了,希望大家能

    • 问题内容: 我需要对元素进行排序,但不会删除重复项。 我已经去了,因为实际上将值添加到支持的: 然后TreeMap使用 逻辑删除重复项 我写了一个在元素相等的情况下返回1而不是0的a 。因此,在元素相等的情况下,带有此元素将不会覆盖重复项,而只会对其进行排序。 我已经为简单对象测试过,但是我需要一组自定义对象。 这种方法是好的还是有更好的方法来实现呢? 编辑 实际上,我有以下类的ArrayList

    • TreeSet提供了使用树进行存储的Set接口的实现。 对象按排序和升序存储。 访问和检索时间非常快,这使得TreeSet成为存储必须快速找到的大量排序信息的绝佳选择。 以下是TreeSet类支持的构造函数列表。 Sr.No. 构造函数和描述 1 TreeSet( ) 此构造函数构造一个空树集,该树集将根据其元素的自然顺序按升序排序。 2 TreeSet(Collection c) 此构造函数构建

    • 我有一个较大的代码库,包含许多装饰器类,它们通常将除一个方法外的所有方法委托给一个委托对象,例如: 现在,我正在使用Junit 5为这些包装创建单元测试,调用上的每个方法,并希望验证包装委托上是否有调用,这是一个Mockito mock。 以下是我目前的代码: 当我运行这个,我得到的错误是: 我是否做错了什么,或者如果您不知道确切的方法,是否无法验证方法调用?