0

我需要这样的哈希:

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

并像这样创建一个新的哈希:

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

如果散列中成员之间的任何值相同,我需要组合键并删除重复项。

4

5 回答 5

3
h.inject({}) {|r,(k,v)| r[h.select {|_,_v| _v == v}.keys.join(', ')] = v; r}
于 2013-03-09T01:35:35.623 回答
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 }

生成:

{
    “上午 10 点 - 下午 2 点,下午 5 点 - 晚上 7 点” => “周日 - 周六”
}

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

当您可以将数组用作 Ruby 哈希中的键时,为什么要将它们组合成一个字符串?

hash.group_by{ |k,v| v }.each_with_object({}) { |(k,v), h| h[v.map(&:first)] = k }
{
    [“上午 10 点 - 下午 2 点”,“下午 5 点 - 晚上 7 点”] => “周日 - 周六”
}
于 2013-03-08T22:29:29.950 回答
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
}
于 2013-03-09T00:11:12.010 回答
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);
于 2013-03-08T22:04:40.843 回答
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"} 

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

于 2013-03-09T00:23:49.037 回答