我需要一个散列这样的:结合哈希键,如果值是相同
{"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
,并创建一个新的哈希是这样的:
{"10am - 2pm, 5pm - 7pm"=>"Sun - Sat"}
如果有任何值相同之中的成员一个散列,我需要组合键和删除重复。
我需要一个散列这样的:结合哈希键,如果值是相同
{"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
,并创建一个新的哈希是这样的:
{"10am - 2pm, 5pm - 7pm"=>"Sun - Sat"}
如果有任何值相同之中的成员一个散列,我需要组合键和删除重复。
有可能是简单的东西,而真正聪明的人会用一些很酷的东西和禅宗般的飘渺由也许有,但这个工程现在:
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" }
我不知道Ruby的语法,但我会做一个新的哈希键进行值,和值的键,然后组新再次散列成阵列,其中现在值键和键值:P
编辑:
对于那些downvotes,是的,我不知道红宝石,但试图给一个想法解决问题最新错? 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);
{"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
}
我不会在我自己的解决方案进行投票,因为我改变了要求,(实际上在我的代码帮了我以后),但这里是我落得这样做:
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,因为重复的值被压缩到新散列中的一个成员中。所以我在保留每个组件(在一个数组中)的同时反转,然后加入这个数组来创建我正在寻找的字符串。
h.inject({}) {|r,(k,v)| r[h.select {|_,_v| _v == v}.keys.join(', ')] = v; r}
为什么选择散列?你是否在跟踪每个密钥并需要能够快速访问它?或者,你是否使用散列作为队列,并最终需要遍历它并分别处理每个条目?像这样修改密钥就像使用散列作为队列一样,这实际上是一个Array的用途。 – 2013-03-08 22:20:34
为什么将它们组合成一个字符串,当你可以在Ruby哈希中使用数组作为键时? – 2013-03-08 22:23:35
@theTinMan,我正在重新格式化我从API获取的数据。在这些数据中,多天的运行时间相同,因此我将运行时间锁定在一段时间内。我在这里粘贴的结构就是下一步发生的事情,当我将原始的日期数字转换为日期单词时,使用跨度(Sun - Sat)。 – djibouti33 2013-03-09 00:33:43