有时候,需要用上多个key,比如:
  keyid1-keyname1 -->value1   
  keyid2-keyname2 -->value2   
  ...   
  任意选择   
  keyid或keyname   就可以查处对应的value

解决方案 »

  1.   

    晕,刚才写了半天网也无法显示
    可以阿,map里的key是唯一的,但是value不是唯一的!同样的value可以属于多个key,但是互不相干的~
    假如你要实现2个同时指向1个value,也就是说1个改变另一个也跟着改变的话,貌似不可以阿!
      

  2.   

    那是不是可以这样呢用两个 Map,像数据表关联那样:
    第一个 Map 是:keyid1 --> value1 这种格式的
    第二个 Map 是:keyname1 --> keyid1 这种格式的
      

  3.   

    回答完全正确,Map其实就是双链表,内存中的地址是完全不一样的
      

  4.   

    LZ应该是想说是否同一个value是否可以由多个不同的key来获得是吧
    如果是这样的话,当然可以,但虽说value值是相同的,但这些value都是不相关联的~如果要实现多个key使用同一个value对象的话,个人觉得只能采用2楼的方法,把key都关联起来,呵呵
      

  5.   

    写一个树型好了,干吗要用Map
      

  6.   

    人家问的是MAP你说让他搞个树
    别人要搞个树你还不是说弄个复杂MAP丫
    消失吧你
      

  7.   

    不会吧,你有多少数据?HashMap 是采用 hashCode 分桶存放的,通过 key 来查找时速度是非常快的。就算最坏的情况下需要查找两次,速度也没有耗掉多少嘿嘿,这样简单一些,如果要双键 HashMap 的话,写写也不是那么简单的吧。
      

  8.   

    keyid1-keyname1 -->value1   
      keyid2-keyname2 -->value2   那就直接
    keyid1- -->value1   
    keyname1 -->value1
    keyid2- -->value2   
    keyname2 -->value2  不可以? 
      

  9.   


    我认为不是很好理由:一般来说 key 都是比较短小的,而 value 都是比较大的,
    这样的话会造成巨大的浪费,而且在要更改 value 时是非常麻烦
    的(得同步两个 value)。如果 value 不是很大,也不需要更改的话,这种方法我认为也未
    尝不可。哈哈,经典
    鱼和熊掌不能兼得呢 :)
      

  10.   

    xuexi xuexixuexi xuexixuexi xuexi
      

  11.   


    个人认为可以,上面有个网友说value很大会造成浪费,其实不然,value是一个object,put进Map里的时候也只是地址传递,并不是clone一个新的value.个人更希望写一个Map类,在Map内部增加一个keySet,但实现起来就需要多点时间.主要实put与get功能 put(key,key,value); get(anykey);
      

  12.   


    就是内存地址,找到那个value的地址 你前边随便怎么加。
    个人看法。
      

  13.   

    同意17楼的说法。把value外面封装一个自己的对象就可以了。myObject1.setValue(value1)
    myObject2.setValue(value2)
    keyid1- -->myObject1   
    keyname1 -->myObject1 
    keyid2- -->myObject2    
    keyname2 -->myObject2   取值用 ((MyObject)XXX.get(keyid1)).getValue()
    如果要赋值用((MyObject)XXX.get(keyid1)).set(value3)
      

  14.   

    提醒 LZ 一下,这个方法不一定可以。请 LZ 回答这样两个问题:1. 每个 keyid 在所有的 keyid 中是否具有唯一性?
    2. 每个 keyname 在所有的 keyname 中是否具有唯一性?如果答案是肯定的,那么,你一开始的问题根本就不存在,直接可以退化成为
      keyid1 -->value1
      keyid2 -->value2如果答案是否定的,那么,前面说的这个方法是不行的,因为在 Map 中,相同的 key 只能得到唯一的 value。
      

  15.   

    还在搞这个问题不同的KEY有相同的值 或者没相同的值 有什么区别?
    2个开关 关同一个灯 和关不同的灯 有什么区别?值相同/不同 这个只是障眼法
    关键是KEY(从某种意义上说 KEY才是MAP的VALUE)为什么要有不同的KEY指向相同的值
    想象下 过道2头的开关 一起控制过道中间的一盏灯
      

  16.   

    有一个比较简单的方法,不知是否合用:String mkey = keyid + "," + keyname;
    map.put(mkey, value);我这里选择逗号做分隔符,你可以选任何一个在 keyid 和 keyname 中都不可能出现的字符作为分隔符。
      

  17.   


    有些情况有两个key 会方便很多的,比如:ResultSet 可以用getString(int 列号)取值 也有可以用getString(String 列名)来取值,  
    类似这样的情况很多,有些时候不是实现了就行,还要想想能不能做得更好,这是我写程序的原则.
      

  18.   

    我提出问题之前已经用了这种方法了,只是上来问问看看有没有什么收获.
    keyid1- -->value1      
    keyname1 -->value1   
    keyid2- -->value2      
    keyname2 -->value2     
      

  19.   

    keyid1- -->value 
    keyname1 -->value
    那两个value的HashCode是不是不同?
    如果不同那怎么处理修改一个value而两个key的指向的内存位置上的value值同时改变
      

  20.   

    boost库中的muti-Index 可以实现,不过看不懂!可以自己设计一个类,包装两个map,指向下面的结构;然后再设计一下;struct TrueObj{
    _key1 mkey1;     //设计技巧一,将两个内部map关联起来 
    _key2 mkey2;     //设计技巧一,将两个内部map关联起来
    _Value *mvalue;  //指针,设计技巧二
    };
      

  21.   

    template<class _key1, class _key2, class _Value>
    class MyTwoKeyMap{
    std::map<_key1,  TrueObj> key1Map;
    std::map<_key2,  TrueObj> key2Map;
    }