有谁写过具有多个key的Map对象? 有时候,需要用上多个key,比如: keyid1-keyname1 -->value1 keyid2-keyname2 -->value2 ... 任意选择 keyid或keyname 就可以查处对应的value 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 晕,刚才写了半天网也无法显示可以阿,map里的key是唯一的,但是value不是唯一的!同样的value可以属于多个key,但是互不相干的~假如你要实现2个同时指向1个value,也就是说1个改变另一个也跟着改变的话,貌似不可以阿! 那是不是可以这样呢用两个 Map,像数据表关联那样:第一个 Map 是:keyid1 --> value1 这种格式的第二个 Map 是:keyname1 --> keyid1 这种格式的 回答完全正确,Map其实就是双链表,内存中的地址是完全不一样的 LZ应该是想说是否同一个value是否可以由多个不同的key来获得是吧如果是这样的话,当然可以,但虽说value值是相同的,但这些value都是不相关联的~如果要实现多个key使用同一个value对象的话,个人觉得只能采用2楼的方法,把key都关联起来,呵呵 写一个树型好了,干吗要用Map 人家问的是MAP你说让他搞个树别人要搞个树你还不是说弄个复杂MAP丫消失吧你 不会吧,你有多少数据?HashMap 是采用 hashCode 分桶存放的,通过 key 来查找时速度是非常快的。就算最坏的情况下需要查找两次,速度也没有耗掉多少嘿嘿,这样简单一些,如果要双键 HashMap 的话,写写也不是那么简单的吧。 keyid1-keyname1 -->value1 keyid2-keyname2 -->value2 那就直接keyid1- -->value1 keyname1 -->value1keyid2- -->value2 keyname2 -->value2 不可以? 我认为不是很好理由:一般来说 key 都是比较短小的,而 value 都是比较大的,这样的话会造成巨大的浪费,而且在要更改 value 时是非常麻烦的(得同步两个 value)。如果 value 不是很大,也不需要更改的话,这种方法我认为也未尝不可。哈哈,经典鱼和熊掌不能兼得呢 :) xuexi xuexixuexi xuexixuexi xuexi 个人认为可以,上面有个网友说value很大会造成浪费,其实不然,value是一个object,put进Map里的时候也只是地址传递,并不是clone一个新的value.个人更希望写一个Map类,在Map内部增加一个keySet,但实现起来就需要多点时间.主要实put与get功能 put(key,key,value); get(anykey); 就是内存地址,找到那个value的地址 你前边随便怎么加。个人看法。 同意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) 提醒 LZ 一下,这个方法不一定可以。请 LZ 回答这样两个问题:1. 每个 keyid 在所有的 keyid 中是否具有唯一性?2. 每个 keyname 在所有的 keyname 中是否具有唯一性?如果答案是肯定的,那么,你一开始的问题根本就不存在,直接可以退化成为 keyid1 -->value1 keyid2 -->value2如果答案是否定的,那么,前面说的这个方法是不行的,因为在 Map 中,相同的 key 只能得到唯一的 value。 还在搞这个问题不同的KEY有相同的值 或者没相同的值 有什么区别?2个开关 关同一个灯 和关不同的灯 有什么区别?值相同/不同 这个只是障眼法关键是KEY(从某种意义上说 KEY才是MAP的VALUE)为什么要有不同的KEY指向相同的值想象下 过道2头的开关 一起控制过道中间的一盏灯 有一个比较简单的方法,不知是否合用:String mkey = keyid + "," + keyname;map.put(mkey, value);我这里选择逗号做分隔符,你可以选任何一个在 keyid 和 keyname 中都不可能出现的字符作为分隔符。 有些情况有两个key 会方便很多的,比如:ResultSet 可以用getString(int 列号)取值 也有可以用getString(String 列名)来取值, 类似这样的情况很多,有些时候不是实现了就行,还要想想能不能做得更好,这是我写程序的原则. 我提出问题之前已经用了这种方法了,只是上来问问看看有没有什么收获.keyid1- -->value1 keyname1 -->value1 keyid2- -->value2 keyname2 -->value2 keyid1- -->value keyname1 -->value那两个value的HashCode是不是不同?如果不同那怎么处理修改一个value而两个key的指向的内存位置上的value值同时改变 boost库中的muti-Index 可以实现,不过看不懂!可以自己设计一个类,包装两个map,指向下面的结构;然后再设计一下;struct TrueObj{_key1 mkey1; //设计技巧一,将两个内部map关联起来 _key2 mkey2; //设计技巧一,将两个内部map关联起来_Value *mvalue; //指针,设计技巧二}; template<class _key1, class _key2, class _Value>class MyTwoKeyMap{std::map<_key1, TrueObj> key1Map;std::map<_key2, TrueObj> key2Map;} 如何相互转换 java语言如何在平面坐标系内随机的生成点 为什么????????????? 紧急求助:JScrollPane的横向滚动条怎么总是显示不出来? 求jbiulder2006下载 如何求两条线的交叉点坐标? 构造方法问题?? 初学JAVA编程,关于文本框输入回车,将字符送入文本区域的问题. 怎样把地址栏中的中文转换成如下:%D6%D0%CE%C4 如何使得TextArea的竖向滚动条,随着TextArea中添加的条目,自动向下滚动,以自动显示最后一行 跪求JDK源码! 请教java泛型通配符问题
可以阿,map里的key是唯一的,但是value不是唯一的!同样的value可以属于多个key,但是互不相干的~
假如你要实现2个同时指向1个value,也就是说1个改变另一个也跟着改变的话,貌似不可以阿!
第一个 Map 是:keyid1 --> value1 这种格式的
第二个 Map 是:keyname1 --> keyid1 这种格式的
如果是这样的话,当然可以,但虽说value值是相同的,但这些value都是不相关联的~如果要实现多个key使用同一个value对象的话,个人觉得只能采用2楼的方法,把key都关联起来,呵呵
别人要搞个树你还不是说弄个复杂MAP丫
消失吧你
keyid2-keyname2 -->value2 那就直接
keyid1- -->value1
keyname1 -->value1
keyid2- -->value2
keyname2 -->value2 不可以?
我认为不是很好理由:一般来说 key 都是比较短小的,而 value 都是比较大的,
这样的话会造成巨大的浪费,而且在要更改 value 时是非常麻烦
的(得同步两个 value)。如果 value 不是很大,也不需要更改的话,这种方法我认为也未
尝不可。哈哈,经典
鱼和熊掌不能兼得呢 :)
个人认为可以,上面有个网友说value很大会造成浪费,其实不然,value是一个object,put进Map里的时候也只是地址传递,并不是clone一个新的value.个人更希望写一个Map类,在Map内部增加一个keySet,但实现起来就需要多点时间.主要实put与get功能 put(key,key,value); get(anykey);
就是内存地址,找到那个value的地址 你前边随便怎么加。
个人看法。
myObject2.setValue(value2)
keyid1- -->myObject1
keyname1 -->myObject1
keyid2- -->myObject2
keyname2 -->myObject2 取值用 ((MyObject)XXX.get(keyid1)).getValue()
如果要赋值用((MyObject)XXX.get(keyid1)).set(value3)
2. 每个 keyname 在所有的 keyname 中是否具有唯一性?如果答案是肯定的,那么,你一开始的问题根本就不存在,直接可以退化成为
keyid1 -->value1
keyid2 -->value2如果答案是否定的,那么,前面说的这个方法是不行的,因为在 Map 中,相同的 key 只能得到唯一的 value。
2个开关 关同一个灯 和关不同的灯 有什么区别?值相同/不同 这个只是障眼法
关键是KEY(从某种意义上说 KEY才是MAP的VALUE)为什么要有不同的KEY指向相同的值
想象下 过道2头的开关 一起控制过道中间的一盏灯
map.put(mkey, value);我这里选择逗号做分隔符,你可以选任何一个在 keyid 和 keyname 中都不可能出现的字符作为分隔符。
有些情况有两个key 会方便很多的,比如:ResultSet 可以用getString(int 列号)取值 也有可以用getString(String 列名)来取值,
类似这样的情况很多,有些时候不是实现了就行,还要想想能不能做得更好,这是我写程序的原则.
keyid1- -->value1
keyname1 -->value1
keyid2- -->value2
keyname2 -->value2
keyname1 -->value
那两个value的HashCode是不是不同?
如果不同那怎么处理修改一个value而两个key的指向的内存位置上的value值同时改变
_key1 mkey1; //设计技巧一,将两个内部map关联起来
_key2 mkey2; //设计技巧一,将两个内部map关联起来
_Value *mvalue; //指针,设计技巧二
};
class MyTwoKeyMap{
std::map<_key1, TrueObj> key1Map;
std::map<_key2, TrueObj> key2Map;
}