嵌套HashMap 存放三元组的问题

justmewei 2010-12-02 09:45:21
如何构建嵌套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次。
求高手解答~
...全文
907 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
写成这样的结构:Map<Bean, Integer>

Bean 中有“单词”和“词性”两个属性
caofaping 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 justmewei 的回复:]
引用 10 楼 caofaping 的回复:
引用 9 楼 justmewei 的回复:
引用 4 楼 bao110908 的回复:
写成这样的结构:Map<Bean, Integer>

Bean 中有“单词”和“词性”两个属性

你好,能详细说下,Bean怎么实现吗?是定义一个类,类有两个属性,分别为“单词”“词性”吗?这样会不会对查询和更新有影响呀?我指的是效率。

把这三……
[/Quote]

重写Words类的equals和hashcode方法就可以了
justmewei 2010-12-03
  • 打赏
  • 举报
回复
用了最笨的方法实现了,感觉这样不完美呀。

HashMap<String, Integer> word_pos_freq = new HashMap<String, Integer>();
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
justmewei 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 caofaping 的回复:]
引用 9 楼 justmewei 的回复:
引用 4 楼 bao110908 的回复:
写成这样的结构:Map<Bean, Integer>

Bean 中有“单词”和“词性”两个属性

你好,能详细说下,Bean怎么实现吗?是定义一个类,类有两个属性,分别为“单词”“词性”吗?这样会不会对查询和更新有影响呀?我指的是效率。

把这三个属性定义一个类不行么?如5楼所说的。
查询和……
[/Quote]
class Words{
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合并,相应地词频累加。
高手来说说看。谢谢了》
caofaping 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 justmewei 的回复:]
引用 4 楼 bao110908 的回复:
写成这样的结构:Map<Bean, Integer>

Bean 中有“单词”和“词性”两个属性

你好,能详细说下,Bean怎么实现吗?是定义一个类,类有两个属性,分别为“单词”“词性”吗?这样会不会对查询和更新有影响呀?我指的是效率。
[/Quote]
把这三个属性定义一个类不行么?如5楼所说的。
查询和更新还不是一个个比较,差不多!
justmewei 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bao110908 的回复:]
写成这样的结构:Map<Bean, Integer>

Bean 中有“单词”和“词性”两个属性
[/Quote]
你好,能详细说下,Bean怎么实现吗?是定义一个类,类有两个属性,分别为“单词”“词性”吗?这样会不会对查询和更新有影响呀?我指的是效率。
justmewei 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yktd26 的回复:]
非要用map的话HashMap<String,HashMap<String,Integer>>为啥不行?
你自己想的完全满足你的需要
HashMap<String,HashMap<String,Integer>>
| | |
词 属性 出现次数
对于每个词的子map是相互独立的
词不可能重复,重复了应该合并
[/Quote]
这里我是想把词形相同但词性不同的单词,视为两个单词,分别存储在map中。比如:词性为名词的book与词性为动词的book,就将book视为两个不同的单词,这样把book分别存放在key中,就重复了。所以直接HashMap<String,HashMap<String,Integer>>不可行。当然硬是用此数据结构,也可以,但是在查询的时候,如何知道book在为名词(或动词)的时候出现了几次?
yktd26 2010-12-03
  • 打赏
  • 举报
回复
非要用map的话HashMap<String,HashMap<String,Integer>>为啥不行?
你自己想的完全满足你的需要
HashMap<String,HashMap<String,Integer>>
| | |
词 属性 出现次数
对于每个词的子map是相互独立的
词不可能重复,重复了应该合并
fantasy0126 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 caofaping 的回复:]

引用 11 楼 justmewei 的回复:
引用 10 楼 caofaping 的回复:
引用 9 楼 justmewei 的回复:
引用 4 楼 bao110908 的回复:
写成这样的结构:Map<Bean, Integer>

Bean 中有“单词”和“词性”两个属性

你好,能详细说下,Bean怎么实现吗?是定义一个类,类有两个属性,分别为“单词”“词性”吗?这样会不会……
[/Quote]

949494,就这么搞就OK嘛,新写一个类做为HashSet的value就OK了
islandrabbit 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 islandrabbit 的回复:]
根本不用Map。直接用一个类有三个属性:1.词 2.词性 3.出现次数
齐活儿
[/Quote]

补充一点:
如果为了便于查找,可以用map,key=词+词性 value=上面的那个类
islandrabbit 2010-12-03
  • 打赏
  • 举报
回复
根本不用Map。直接用一个类有三个属性:1.词 2.词性 3.出现次数
齐活儿
justmewei 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yelongyelong 的回复:]
可以这样的弄
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();……
[/Quote]
我的意图是将
<book,nn,10>
<book,vb,13>
<take,vb,6>
<good,adj,13>
存放在一个Map中 不是分别建立4个Map
kebin0001 2010-12-02
  • 打赏
  • 举报
回复
不同 KEY 裡面的 HashMap的KEY可以重複
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}

這樣沒什麼不可以。
yelongyelong 2010-12-02
  • 打赏
  • 举报
回复
可以这样的弄
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"));
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧