我需要这样的哈希:
{"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
并像这样创建一个新的哈希:
{"10am - 2pm, 5pm - 7pm"=>"Sun - Sat"}
如果散列中成员之间的任何值相同,我需要组合键并删除重复项。
h.inject({}) {|r,(k,v)| r[h.select {|_,_v| _v == v}.keys.join(', ')] = v; r}
可能有一些更简单的东西,也许其中一个真正聪明的人会带着一些很酷和禅宗的东西徘徊,但现在这行得通:
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 点”] => “周日 - 周六” }
{"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
}
我不知道 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);
我不会对我自己的解决方案进行投票,因为我更改了要求(实际上后来在我的代码中帮助了我),但这是我最终做的:
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"}
我不能只调用反转,因为重复的值会被压缩到新哈希中的一个成员中。所以我在保留每个组件(在数组中)的同时进行反转,然后加入该数组以生成我正在寻找的字符串。