【问题标题】:A map with two keys [duplicate]有两个键的地图[重复]
【发布时间】:2011-11-26 02:36:18
【问题描述】:

可能重复:
How to implement a Map with multiple keys?
Multiple Keys to Single Value Map Java

我必须根据两个传入的字符串属性来获取枚举的值。我一直将其作为单个值的映射。现在我面临着进行串联。有没有办法让地图有两个键,这样我就可以了

Map.get("attr1","attr2");

这将返回正确的枚举。还是我只需连接所有可能的值并将其用作键?

我正在寻找干净利落的解决方案(我们不都是:P)

【问题讨论】:

标签: java string map key concat


【解决方案1】:

好吧,你可以使用Map<String, Map<String, YourEnum>>

我们经常使用它,因此制作了自己的 Map 实现,它提供两个键并在内部使用 map-of-maps 方法。

【讨论】:

    【解决方案2】:

    你可以有一张地图,即

    Map.get("attr1").get("attr2");
    

    或者你可以用equals方法定义一个对象,即

    Map.get(new MyObject("attr1", "attr2"));
    

    【讨论】:

      【解决方案3】:

      在这种情况下,我将使用这两个属性创建一个包装类,实现 equals() 并可能实现 ComparablecompareTo 委托给复合键的两个元素。并使用此类作为地图的关键。

      这就像滚动你自己的Pair 课程。看看这个问题的答案,详细说明这个问题:What is the equivalent of the C++ Pair in Java?

      【讨论】:

        【解决方案4】:

        为什么不创建一个包含这两个键的类并将其用作映射键?

        例如:

        public class BiKey implements comparable<BiKey>
        {
          private String key1;
          private String key2;
        
          // getters and setters
        
          // equals and hash code.
        
          // implement comparable.
        }
        
        Map <BiKey, Blammy> blammyMap; // Blammy is the value type.
        

        【讨论】:

          【解决方案5】:

          与 Thomas 的方法类似,我们(在我的工作中)有“维度”地图类,它们是几个地图的简单包装器。

          public class MultiKeyMap {
            private HashMap<keyOne, Object> keyOneToObjectMap;
            private HashMap<keyTwo, Object> keyTwoToObjectMap;
            ...etc
          
          
          }
          

          保持所有地图彼此同步非常容易,并且无需大量潜在的复杂代码即可进行相当快速的搜索。 (但是,这是以增加内存使用为代价的)

          【讨论】:

            【解决方案6】:

            org.apache.commons.collections.map.MultiKeyMap 就是你想要的

            http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiKeyMap.html

            例子

             private MultiKeyMap cache = MultiKeyMap.decorate(new LRUMap(50));
            
             public String getAirlineName(String code, String locale) {
               String name = (String) cache.get(code, locale);
               if (name == null) {
                 name = getAirlineNameFromDB(code, locale);
                 cache.put(code, locale, name);
               }
               return name;
             }
            

            【讨论】:

              猜你喜欢
              • 2018-05-12
              • 1970-01-01
              • 2017-02-23
              • 2021-07-19
              • 2021-03-22
              • 1970-01-01
              • 2015-12-13
              • 2019-01-28
              • 1970-01-01
              相关资源
              最近更新 更多