1

次のように、いくつかの配列を含むハッシュを含むハッシュがあります。

{ "bob" =>
    {  
       "foo" => [1, 3, 5],
       "bar" => [2, 4, 6]
    },
  "fred" =>
    {  
       "foo" => [1, 7, 9],
       "bar" => [8, 10, 12]
    }
} 

配列を他の配列と比較して、それらが重複している場合は警告したいと思います。と は重複する可能性がありますがhash["bob"]["foo"]、 とhash["fred"]["foo"]は重複しません。と同じ。hash["bob"]["foo"]hash["bob"]["bar"]hash["fred"]

私はこれをどこから始めるべきかさえ理解できません。どこinjectかで関与していると思いますが、間違っている可能性があります。

4

4 に答える 4

1
h =  {
  "bob" =>
    {
       "foo" => [1, 3, 5],
       "bar" => [2, 4, 6]
    },
  "fred" =>
    {  
       "foo" => [1, 7, 9],
       "bar" => [1, 10, 12]
    }
}

h.each do |k, v|
  numbers = v.values.flatten
  puts k if numbers.length > numbers.uniq.length
end
于 2012-09-28T13:44:26.667 に答える
1

このスニペットは、各キーの重複の配列を返します。重複は、等しいキーに対してのみ生成できます。

duplicates = (keys = h.values.map(&:keys).flatten.uniq).map do |key|
  {key =>  h.values.map { |h| h[key] }.inject(&:&)}
end

[{"foo"=>[1]}, {"bar"=>[]}]これは、キーfooが の重複を含む唯一のものであることを示す を返します1

上記のスニペットhは、ハッシュの変数名であると想定しています。

于 2012-09-28T14:00:01.397 に答える
0

それを行うには多くの方法があります。これが読みやすいはずです。Ruby1.9で動作します。+を使用して2つの配列を結合してから、uniqを使用します。重複する番号があるかどうかを判断するための演算子。

h = { "bob" =>
{  
   "foo" => [1, 3, 5],
   "bar" => [2, 4, 6]
},
"fred" =>
{  
   "foo" => [1, 7, 12],
   "bar" => [8, 10, 12]
}
}

h.each  do |person|
    if (person[1]["foo"] + person[1]["bar"]).uniq! != nil  
        puts "Duplicate in #{person[1]}"
    end
end
于 2012-09-28T13:32:55.960 に答える
0

正確に何を探しているのかわかりません。しかし、考えられる解決策を見ると、おそらく何かを再利用できます。

outer_hash.each do |person, inner_hash|
  seen_arrays = Hash.new

  inner_hash.each do |inner_key, array|
    other = seen_arrays[array]
    if other
      raise "array #{person}/#{inner_key} is a duplicate of #{other}"
    end
    seen_arrays[array] = "#{person}/#{inner_key}"
  end
end
于 2012-09-28T13:37:20.750 に答える