如何构建嵌套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次。
求高手解答~

解决方案 »

  1.   

    可以这样的弄
    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"));
    }
      

  2.   

    不同 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}這樣沒什麼不可以。
      

  3.   

    我的意图是将
    <book,nn,10>  
      <book,vb,13>
      <take,vb,6>
      <good,adj,13>
    存放在一个Map中 不是分别建立4个Map 
      

  4.   

    写成这样的结构:Map<Bean, Integer>Bean 中有“单词”和“词性”两个属性
      

  5.   

    根本不用Map。直接用一个类有三个属性:1.词  2.词性 3.出现次数 
    齐活儿
      

  6.   


    补充一点:
    如果为了便于查找,可以用map,key=词+词性 value=上面的那个类
      

  7.   

    非要用map的话HashMap<String,HashMap<String,Integer>>为啥不行?
    你自己想的完全满足你的需要
    HashMap<String,HashMap<String,Integer>>
              |              |        |
             词             属性     出现次数
    对于每个词的子map是相互独立的
    词不可能重复,重复了应该合并
      

  8.   

    这里我是想把词形相同但词性不同的单词,视为两个单词,分别存储在map中。比如:词性为名词的book与词性为动词的book,就将book视为两个不同的单词,这样把book分别存放在key中,就重复了。所以直接HashMap<String,HashMap<String,Integer>>不可行。当然硬是用此数据结构,也可以,但是在查询的时候,如何知道book在为名词(或动词)的时候出现了几次?
      

  9.   

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

  10.   

    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合并,相应地词频累加。
    高手来说说看。谢谢了》 
      

  11.   

    用了最笨的方法实现了,感觉这样不完美呀。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
      

  12.   


    重写Words类的equals和hashcode方法就可以了
      

  13.   


    949494,就这么搞就OK嘛,新写一个类做为HashSet的value就OK了