2013-03-08 80 views
0

我需要一个散列这样的:结合哈希键,如果值是相同

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

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

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

如果有任何值相同之中的成员一个散列,我需要组合键和删除重复。

+1

为什么选择散列?你是否在跟踪每个密钥并需要能够快速访问它?或者,你是否使用散列作为队列,并最终需要遍历它并分别处理每个条目?像这样修改密钥就像使用散列作为队列一样,这实际上是一个Array的用途。 – 2013-03-08 22:20:34

+3

为什么将它们组合成一个字符串,当你可以在Ruby哈希中使用数组作为键时? – 2013-03-08 22:23:35

+0

@theTinMan,我正在重新格式化我从API获取的数据。在这些数据中,多天的运行时间相同,因此我将运行时间锁定在一段时间内。我在这里粘贴的结构就是下一步发生的事情,当我将原始的日期数字转换为日期单词时,使用跨度(Sun - Sat)。 – djibouti33 2013-03-09 00:33:43

回答

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" 
} 
0

我不知道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); 
+0

老实说,我不知道我的逻辑downvote有什么问题,将不胜感激地指出。我只是这样做,并且工作了 – Kossel 2013-03-08 22:31:44

+0

是的,它看起来很简单,所以显示一些代码,这是OP正在寻找的。 – 2013-03-08 22:33:54

+0

@theTinMan,他说他不知道红宝石,所以我们不能指望“一些代码”( – SET 2013-03-08 22:40:44

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 
} 
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,因为重复的值被压缩到新散列中的一个成员中。所以我在保留每个组件(在一个数组中)的同时反转,然后加入这个数组来创建我正在寻找的字符串。

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