【问题标题】:A data structure similar to a HashMap with more than one "distinct" value一种类似于 HashMap 的数据结构,具有多个“不同”值
【发布时间】:2015-11-06 23:17:58
【问题描述】:

是否有任何类似的数据结构可以存储一个键,并且与HashMap<Key, Value> 不同,它存储了更多关于单个键的值?如果没有,有什么建议吗?因为制作多个具有相同键和不同值的 HashMap 看起来并不那么整洁。

编辑 当我说多个值时,我的意思是不同的值。例如,考虑一张地图,其中每个人都有一个密钥,我们希望存储人的姓名、地址和电话号码。

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    根据您的编辑,您可能仍希望为每个键存储一个值,但将值设为对象。例如

    public class PersonInfo {
         private String name;
         private String address;
         private String phoneNumber;
         etc...
    }
    

    并将您的地图定义为HashMap<Key, PersonInfo>

    【讨论】:

    • 想象在运行时,我们知道他有多少个数字,然后我们想将这些特定数字输入到 HashMap 中
    • @seventeen 然后您将使用字符串集合而不是单个字符串。无论您想在 Object 中包含多少信息,它仍然只是一个对象。
    • @seventeen 在这种情况下,PersonInfo 应该有一个private List<String> phoneNumbersHashMap 不必知道这一点,这是他们拥有零个或多个电话号码的人的属性。
    【解决方案2】:

    检查Guava's Multimap!它允许您为同一个键有多个值。

    示例

    Multimap<String, String> multimap = ArrayListMultimap.create();
    
    multimap.put("Fruits", "Banana");
    multimap.put("Fruits", "Apple");
    multimap.put("Fruits", "Pear");
    multimap.put("Vegetables", "Carrot");
    
    // Getting values
    Collection<string> fruits = myMultimap.get("Fruits");
    

    Guava 是一个对 Java 程序员非常有用的库,你一定要看看!

    编辑

    在你编辑之后,你真的只需要一个简单的HashMap&lt;Key, Person&gt;。您可以像这样定义Person 类:

    public class Person {
        private String name;
        private String address;
        private String phoneNumber;
    
        public Person(String name, String address, String phoneNumber) {
            this.name = name;
            this.address = address;
            this.phoneNumber = phoneNumber;
        }
    
        public String getName() {
            return name;
        }
    
        public String getAddress() {
            return address;
        }
    
        public String getPhoneNumber() {
            return phoneNumber;
        }
    }
    

    使用您的HashMap&lt;Key, Person&gt;,其中Key 可以是String,例如:

    Map<String, Person> personMap = new HashMap<String, Person>();
    
    personMap.put("patrick_key", new Person("Patrick", "1000 Notre-Dame street", "123456789"));
    personMap.put("stephan_key", new Person("Stephan", "2000 Notre-Dame street", "987654321"));
    

    那么你可以像这样访问Patrick

    Person person = personMap.get("patrick_key");
    

    【讨论】:

    • 您所说的独特价值是什么意思?为什么不直接使用Person 对象?以简单的HashMap&lt;String, Person&gt; 为例。
    • 我觉得 HashMap 看起来更容易访问,我想它一定更快?
    • 这个案例怎么样,我们不知道一个人只有一个电话号码,可能有两个或多个电话号码。或者可能有不止一个 adr?家庭 adr 和工作 adr 以及其他可能的 adr。那么无论如何要使电话(或任何这些值)的实例数量动态?
    • @seventeen 只需创建另一个构造函数或使用带有 setter 的默认构造函数。
    • 想象在运行时,我们知道他有多少个数字,然后我们想将这些特定数字输入到 HashMap。
    【解决方案3】:

    使用哈希图,每个“值”都是一个列表(根据您的需要链接或双链接)。

    【讨论】:

    • 如何创建一个新类来分组您需要的所有值?因为在 OO 编程中,单独存储属于同一概念对象的值是没有意义的
    【解决方案4】:

    一个简单的解决方案是创建某种形式的 PersonInfo 对象,然后将该值与键字符串一起映射。当您想调用不同的键时,您可以检索包含您希望描述的关于该人的任何值的对象。

    如果您希望它们不同,您可以将每个电话号码记录在单独的列表中,并且在用户输入号码时,您可以对照全球号码列表进行检查。 (地址/姓名可以使用两次,因为它们很常见,即认为 Junior 和 Senior 住在同一个家中)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多