如何找到散列的重复数组并在Ruby中打印它们
我有一个哈希数组:如何找到散列的重复数组并在Ruby中打印它们,ruby,hash,Ruby,Hash,我有一个哈希数组: [ {:name=>"King Summer", :number=>"0034242342"}, {:name=>"Max Snow", :number=>"899899080"}, {:name=>"Duck Doe", :number=>"90897688"}, {:name=>"Shark Jon", :number=>"0034242342"} ] 在上面,key:number{:name=>“K
[
{:name=>"King Summer", :number=>"0034242342"},
{:name=>"Max Snow", :number=>"899899080"},
{:name=>"Duck Doe", :number=>"90897688"},
{:name=>"Shark Jon", :number=>"0034242342"}
]
在上面,key:number
{:name=>“King Summer”,:number=>“0034242342”}
的值与{:name=>“Shark Jon”,:number=>“0034242342”}重复
如何在控制台中找到重复的:编号并显示如下输出:
=== List with duplicate number ===
King Summer – 0034242342 : ok
Max Snow – 899899080 : ok
Duck Doe – 90897688 : ok
Shark Jon – 0034242342 : duplicate number
== List without duplicate number ===
1 - King Summer – 0034242342
2 - Max Snow – 899899080
3 - Duck Doe – 90897688
您只需使用
inject
添加状态,其中inject的累加器将保存以前迭代中传递的数字
arr.inject([]) { |m,a| m.include?(a[:number]) ? (a[:status] = 'duplicated number') : ((m << a[:number]) && (a[:status] = 'ok')); m}
arr
# [
# {:name=>"King Summer", :number=>"0034242342", :status=>"ok"},
# {:name=>"Max Snow", :number=>"899899080", :status=>"ok"},
# {:name=>"Duck Doe", :number=>"90897688", :status=>"ok"},
# {:name=>"Shark Jon", :number=>"0034242342", :status=>"duplicated number"}
# ]
arr.inject([]){m,a | m.include?(a[:number])?(a[:status]=“重复的数字”):((m“King Summer”,“:number=>”00342342“,:status=>”ok“),
#{:name=>“Max Snow”,:number=>“899899080”,:status=>“ok”},
#{:name=>“Duck Doe”,:number=>“90897688”,:status=>“ok”},
#{:name=>“Shark Jon”,:number=>“0034242342”,:status=>“duplicated number”}
# ]
稍后使用
每个迭代此数据。您可以这样做。可能不是最干净的方法
duplicated = []
non_duplicated = []
array = [
{:name=>"King Summer", :number=>"0034242342"},
{:name=>"Max Snow", :number=>"899899080"},
{:name=>"Duck Doe", :number=>"90897688"},
{:name=>"Shark Jon", :number=>"0034242342"}
]
array.each do |a|
is_duplicated = non_duplicated.find do |i|
i == a[:number]
end
if is_duplicated
duplicated.push(a[:number])
non_duplicated.delete(a[:number])
next
end
non_duplicated.push(a[:number])
end
编辑
另类
array.partition do |value|
number = value[:number]
array.map do |i|
i[:number]
end.count(number) > 1
end
这将返回一个包含2个部分的数组(重复,其余部分):
另一个选项是构建一个散列,将重复(true)和非重复(false)分组
给定阵列:
ary = [
{name: "King Summer", number: "0034242342"},
{name: "Max Snow", number: "899899080"},
{name: "Duck Doe", number: "90897688"},
{name: "Shark Jon", number: "0034242342"},
{name: "Jim Kirk", number: "90897688"},
{name: "Mr. Spock", number: "10897688"}
]
构建哈希:
res = ary.group_by { |h| h[:number] }.group_by { |_,v| v.size > 1 }.transform_values(&:to_h)
#=> {true=>{"0034242342"=>[{:name=>"King Summer", :number=>"0034242342"}, {:name=>"Shark Jon", :number=>"0034242342"}], "90897688"=>[{:name=>"Duck Doe", :number=>"90897688"}, {:name=>"Jim Kirk", :number=>"90897688"}]}, false=>{"899899080"=>[{:name=>"Max Snow", :number=>"899899080"}], "10897688"=>[{:name=>"Mr. Spock", :number=>"10897688"}]}}
然后列出重复的:
res[true].each do |number, people|
puts "- ph. number: #{number}"
people.each { |person| puts "\t"*2 + person[:name] }
end
# - ph. number: 0034242342
# King Summer
# Shark Jon
# - ph. number: 90897688
# Duck Doe
# Jim Kirk
或
你试过什么?有什么问题吗?可能是重复的谢谢你,但是状态没有添加,所有状态都正常。我试过irb:irb(main):011:0>arr.inject([]){m,a | a.include?(a[:number])?(a[:status]=“duplicated number”):((m[“00342342”,“899899080”,“9089897688”,“00342342”]irb(主要):012:0>arr=>[{:name=>“King Summer”,:number=>“00342342”,:status=>“ok”},{:name=>“Max Snow”,:number=>“899899080”,:status=>“ok”,{:name=>“Duck Doe”,:number=>“90897688”,:status=>“ok”,{:name=>“Shark Jon”,:number=>“00342342”,:status=>“ok”]@spn很抱歉,由于需要m.include?
而不是a.include?
,因此出现了一些小的更正。请检查更新的回答谢谢!注意,现有数组已在此处更新,如果您以这种方式分配到两个数组时,为了更好地使用它,请接受:)@SRack谢谢您的反馈:),我不知道这个方法。我会更新我的答案
res[true].each do |number, people|
puts "- ph. number: #{number}"
people.each { |person| puts "\t"*2 + person[:name] }
end
# - ph. number: 0034242342
# King Summer
# Shark Jon
# - ph. number: 90897688
# Duck Doe
# Jim Kirk
res.each do |_, list|
puts "-"*10
list.each do |number, people|
puts "- ph. number: #{number}"
people.each { |person| puts "\t"*2 + person[:name] }
end
end
# ----------
# - ph. number: 0034242342
# King Summer
# Shark Jon
# - ph. number: 90897688
# Duck Doe
# Jim Kirk
# ----------
# - ph. number: 899899080
# Max Snow
# - ph. number: 10897688
# Mr. Spock