如何构建嵌套HashMap 存放三元组
比如存放如下内容 <book,nn,10>
<book,vb,13>
<take,vb,6>
<good,adj,13>
由于在HashMap中,Key不允许重复,所以用嵌套HashMap<String,HashMap<String,Integer>>很难实现的,在这个嵌套的HashMap中主键Key不允许重复,被嵌套的HashMap<String,Integer>的主键key也不允许重复。而要存放的三元内容均有重复的,不知道如何实现?有其他更好的数据结构可以实现吗?要求这三元一一对应的,即book作为名词(nn)出现了10次,book作为动词(vb)出现了13次。
求高手解答~
比如存放如下内容 <book,nn,10>
<book,vb,13>
<take,vb,6>
<good,adj,13>
由于在HashMap中,Key不允许重复,所以用嵌套HashMap<String,HashMap<String,Integer>>很难实现的,在这个嵌套的HashMap中主键Key不允许重复,被嵌套的HashMap<String,Integer>的主键key也不允许重复。而要存放的三元内容均有重复的,不知道如何实现?有其他更好的数据结构可以实现吗?要求这三元一一对应的,即book作为名词(nn)出现了10次,book作为动词(vb)出现了13次。
求高手解答~
List<Map<String,String>List list = new ArrayList();Map map1 = new HashMap();
map1.put("keyworkd","book");
map1.put("type","nn");
map1.put("count","10");Map map2 = new HashMap();
map2.put("keyworkd","book");
map2.put("type","vb");
map2.put("count",13);Map map3 = new HashMap();
map3.put("keyworkd","take");
map3.put("type","vb");
map3.put("count",6);
Map map4 = new HashMap();
map4.put("keyworkd","good");
map4.put("type","adj");
map4.put("count,13);
list.add(mp1);
list.add(mp2);
list.add(mp3);
list.add(mp4);
使用:
fo(int i = 0 ;i < list.size(); i++){
Map map = (Map)list.get(i);
System.out.println(map.get("keyword")+" "+map.get("type")+" "+map.get("count"));
}
KEY: book,Value: HashMap --> {Key:nn,Value:10},{Key:vb,Value:13}
KEY: take,Value: HashMap --> {Key:vb,Value:6}
KEY: good,Value: HashMap --> {Key:abj,Value:13}這樣沒什麼不可以。
<book,nn,10>
<book,vb,13>
<take,vb,6>
<good,adj,13>
存放在一个Map中 不是分别建立4个Map
齐活儿
补充一点:
如果为了便于查找,可以用map,key=词+词性 value=上面的那个类
你自己想的完全满足你的需要
HashMap<String,HashMap<String,Integer>>
| | |
词 属性 出现次数
对于每个词的子map是相互独立的
词不可能重复,重复了应该合并
private String word;//单词
private String pos;//单词的词性
/**带参构造函数,传入word_pos,初始化word和POS属性
* @param word_pos 单词_词性
* */
public Words(String word_pos){
String[] temp = word_pos.split("_");
this.word= temp[0];
this.pos=temp[1];
}
/**
* 获取单词
* */
public String getWord(){
return this.word;
}
/**
* 获取单词的词性
* */
public String getPOS(){
return this.pos;
}
}public static void main(String[] args) {
String[] word_pos = { "book_nn",
"take_vb",
"good_adj",
"well_adv",
"book_nn",
"well_adv",
"well_adv",
"well_adv" };
HashMap<Words, Integer> word_pos_freq = new HashMap<Words, Integer>();
for (int i = 0; i < word_pos.length; i++) {
NestHashMapTest.Words w = new NestHashMapTest().new Words(
word_pos[i]); word_pos_freq.put(w, word_pos_freq.containsKey(w) ? word_pos_freq
.get(w) + 1 : 1); }
for (Map.Entry<Words, Integer> e : word_pos_freq.entrySet()) {
System.out.println(e.getKey().getWord()+"_"+e.getKey().getPOS()+"_"+e.getValue());
}
}}输出结果:well_adv_1
take_vb_1
book_nn_1
well_adv_1
good_adj_1
well_adv_1
book_nn_1
well_adv_1
正常来说,应该是
well_adv_4
take_vb_1
book_nn_2
good_adj_1代码出错在哪里了?我想的是出错在NestHashMapTest.Words w = new NestHashMapTest().new Words(
word_pos[i]);
虽然出入相同的内容,如book_nn,但生成的对象是不同的,所以在存放到Map中去时,不能将book_nn合并,相应地词频累加。
高手来说说看。谢谢了》
String[] word_pos = { "book_nn",
"take_vb",
"book_nn",
"book_nn",
"good_adj",
"well_adv",
"book_vb",
"well_adv",
"book_vb",
"well_adv",
"well_adv" };
for (int i = 0; i < word_pos.length; i++) {
word_pos_freq.put(word_pos[i], word_pos_freq.containsKey(word_pos[i])?word_pos_freq.get(word_pos[i]) + 1
: 1);
}
for (Map.Entry<String, Integer> e:word_pos_freq.entrySet()) {
String[] word_pos_temp = e.getKey().split("_");
System.out.println(word_pos_temp[0]+"_"+word_pos_temp[1]+"_"+e.getValue());
}输出结果:take_vb_1
good_adj_1
book_vb_2
well_adv_4
book_nn_3
重写Words类的equals和hashcode方法就可以了
949494,就这么搞就OK嘛,新写一个类做为HashSet的value就OK了