如果值相同,则组合散列键

时间:2013-03-08 22:02:20

标签: ruby hash inject

我需要像这样的哈希:

{"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}

并创建一个新的哈希:

{"10am - 2pm, 5pm - 7pm"=>"Sun - Sat"}

如果哈希中的成员之间的任何值相同,我需要组合键并删除副本。

5 个答案:

答案 0 :(得分:3)

可能会有一些更简单的东西,也许其中一个非常聪明的人会喜欢冷静和禅宗的东西,但现在这样有效:

hash = {"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
hash.group_by{ |k,v| v }.each_with_object({}) { |(k,v), h| h[v.map(&:first).join(', ')] = k }

生成:

{
    "10am - 2pm, 5pm - 7pm" => "Sun - Sat"
}

@muistooshort提出了一个很好的观点:

  

为什么在将数组用作Ruby哈希中的键时将它们组合成一个字符串?

hash.group_by{ |k,v| v }.each_with_object({}) { |(k,v), h| h[v.map(&:first)] = k }
{
    [ "10am - 2pm", "5pm - 7pm" ] => "Sun - Sat"
}

答案 1 :(得分:3)

h.inject({}) {|r,(k,v)| r[h.select {|_,_v| _v == v}.keys.join(', ')] = v; r}

答案 2 :(得分:0)

我不知道ruby语法,但我会创建一个新的哈希,其中键是值,值是键,然后将新哈希再次分组到数组中,其中值现在是键,键是值:P

编辑:

对于那些downvotes,是的我不知道ruby,但尝试提出解决问题的想法有什么不对? OP不必接受我的回答。

这是代码:

HashMap<String, String> hash = new HashMap<String, String>();
        HashMap<String, ArrayList> nhash = new HashMap<String, ArrayList>();
        HashMap<String, String> fhash = new HashMap<String, String>();

        hash.put("10am - 2pm", "Sun - Sat");
        hash.put("5pm - 7pm", "Sun - Sat");

        Iterator it = hash.keySet().iterator();
        while(it.hasNext()){
            String k =it.next().toString();
            String v=hash.get(k);
            if(nhash.get(v)==null){
                ArrayList a = new ArrayList();
                nhash.put(v, a);
                nhash.get(v).add(k);
            }else{
                nhash.get(v).add(k);
            }
        }

        Iterator nit = nhash.keySet().iterator();
        while(nit.hasNext()){
            String k =nit.next().toString();
            ArrayList v=nhash.get(k);
                fhash.put(v.toString(), k);

        }

        System.out.println(fhash);

答案 3 :(得分:0)

{"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
.inject({}){|h, (k, v)|
   _k = h.key(v)
   h.delete(_k)
   h[[*_k, k].join(", ")] = v
   h
}

答案 4 :(得分:0)

我不会对我自己的解决方案进行投票,因为我改变了要求(实际上我的代码后来帮助了我),但这就是我最终要做的事情:

h = {"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
h.reduce({}) { |h, (k,v)| (h[v] ||= []) << k; h}.reduce({}) {|h, (k,v)| h[k] = v.join(', '); h}
# {"Sun - Sat"=>"10am - 2pm, 5pm - 7pm"} 

我不能只调用invert,因为重复的值会被压缩到新哈希中的一个成员中。所以我在保留每个组件(在一个数组中)时进行反转,然后加入该数组以生成我正在寻找的字符串。