Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该在这里使用哪种收藏?_Java_Collections - Fatal编程技术网

Java 我应该在这里使用哪种收藏?

Java 我应该在这里使用哪种收藏?,java,collections,Java,Collections,电话簿包含号码和姓名。如果有人帮我选择最好的收藏,我将不胜感激,这将有助于我的表演 添加姓名和号码 按编号搜索名称 按名称删除名称和编号 目前我正在使用HashMap,但在这里名称和数字都是关键,这不太好。另一种选择是将名称和数字包装在一个对象中,然后将它们添加到列表中。然后迭代并添加到列表中。但如果你能给我推荐一些其他最好的收藏品,我会这么做的 注意:-名称和数字是字符串我会使用一个对象,因为如果您需要存储超过名称和数字的内容,使用它会在行的后面添加更多范围。您可以编写一些帮助函数来获取所需的

电话簿包含号码和姓名。如果有人帮我选择最好的收藏,我将不胜感激,这将有助于我的表演

  • 添加姓名和号码
  • 按编号搜索名称
  • 按名称删除名称和编号
  • 目前我正在使用HashMap,但在这里名称和数字都是关键,这不太好。另一种选择是将名称和数字包装在一个对象中,然后将它们添加到列表中。然后迭代并添加到列表中。但如果你能给我推荐一些其他最好的收藏品,我会这么做的


    注意:-名称和数字是字符串

    我会使用一个对象,因为如果您需要存储超过名称和数字的内容,使用它会在行的后面添加更多范围。您可以编写一些帮助函数来获取所需的数据。

    您仍然可以使用HashMap K=Number V=Name,因为逻辑上搜索速度更重要,您可以使用迭代器按名称删除,例如

    Iterator i = map.entrySet().iterator();
    while(i.hasNext()) {
        Entry e = i.next();
        if (e.getValue().equals("user1898282") {
            i.remove();
        }
    }
    

    如果您需要通过姓名和电话号码进行查询,那么将所有姓名号码对放入一个列表确实是可能的,而且非常简单,但是搜索和删除都将具有线性复杂性

    如果您想要更好的时间复杂度(例如常数或至少对数),您可能需要使用双向映射。例如,番石榴正好提供了这种行为

    如果您需要自己实现(例如,如果这是一个家庭作业),我将创建一个由两个内部
    HashMap
    s组成的类,每个条目的方向一个。这将为您提供恒定时间查找姓名和号码。当然,您必须确保两个地图始终保持同步

    public class PhoneBook {
    
        private Map<String, String> namesToNumbers = new HashMap<>();
        private Map<String, String> numbersToNames = new HashMap<>();
    
        public void insertEntry(String name, String phoneNumber) {
            namesToNumbers.put(name, phoneNumber);
            numbersToNames.put(phoneNumber, name);
        }
    
        public String getNameForPhoneNumber(String phoneNumber) {
            return numbersToNames.get(phoneNumber);
        }
    
        public String getPhoneNumberForName(String name) {
            return namesToNumbers.get(name);
        }
    
        public void removeEntryByPhoneNumber(String phoneNumber) {
            String name = numbersToNames.get(phoneNumber);
            namesToNumbers.remove(name);
            numbersToNames.remove(phoneNumber);
        }
    
        public void removeEntryByName(String name) {
            String phoneNumber = namesToNumbers.get(name);
            numbersToNames.remove(phoneNumber);
            namesToNumbers.remove(name);
        }
    }
    
    公共类电话簿{
    私有映射namesToNumbers=newhashmap();
    私有映射numbersToNames=newhashmap();
    public void insertEntry(字符串名称、字符串电话号码){
    namesToNumbers.put(姓名、电话号码);
    numbersToNames.put(电话号码、姓名);
    }
    公共字符串getNameForPhoneNumber(字符串phoneNumber){
    返回号码tonames.get(电话号码);
    }
    公共字符串getPhoneNumberForName(字符串名称){
    返回namesToNumbers.get(name);
    }
    公共void RemoveEntryPhoneNumber(字符串电话号码){
    字符串名称=numbersToNames.get(phoneNumber);
    名称编号。删除(名称);
    numbersToNames.remove(电话号码);
    }
    public void removeEntryByName(字符串名称){
    字符串phoneNumber=namesToNumbers.get(name);
    numbersToNames.remove(电话号码);
    名称编号。删除(名称);
    }
    }
    
    什么是字符串?它叫什么名字?是否要将名称存储为以数字为键的字符串?我不理解名称、数字和字符串之间的关系string@user1898282所以不要这样写。你的问题要清楚。所以,我们不需要考虑您的问题(您到底想要什么),因为哈希表(大部分)是不必要的同步的,这有一些性能开销。HashMap速度更快。但是,它们都实现了
    Map
    接口,因此如果您使用Map类型声明变量,那么您可以轻松地交换实现。创建两个hashmap…这是空间开销…还有其他方法吗???@user1898282许多编程问题都涉及内存和CPU复杂性之间的折衷。具有两个映射的解决方案在时间上是最优的,但会增加内存开销。