我需要像这样的哈希:
{"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
并创建一个新的哈希:
{"10am - 2pm, 5pm - 7pm"=>"Sun - Sat"}
如果哈希中的成员之间的任何值相同,我需要组合键并删除副本。
答案 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,因为重复的值会被压缩到新哈希中的一个成员中。所以我在保留每个组件(在一个数组中)时进行反转,然后加入该数组以生成我正在寻找的字符串。