Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ruby只拒绝哈希数组中的某些重复项_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails ruby只拒绝哈希数组中的某些重复项

Ruby on rails ruby只拒绝哈希数组中的某些重复项,ruby-on-rails,ruby,Ruby On Rails,Ruby,我想根据重复数(>=3)拒绝哈希数组中的重复项 例如:重复的标准只是名称,而不考虑数字 a = [{:name=>"John Doe1", :number=>"5551234567"}, {:name=>"John Doe1", :number=>"5551234567"}, {:name=>"John Doe2", :number=>"5557654321"}, {:name=>

我想根据重复数(>=3)拒绝哈希数组中的重复项

例如:重复的标准只是名称,而不考虑数字

a = [{:name=>"John Doe1", :number=>"5551234567"},
         {:name=>"John Doe1", :number=>"5551234567"},
              {:name=>"John Doe2", :number=>"5557654321"},
               {:name=>"John Doe1", :number=>"5551234567"}]
我想拒绝重复2次以上的“名称”。 该函数应返回:

[{:name=>"John Doe2", :number=>"5557654321"}]
我尝试了以下可能不正确的方法:

a.group_by{|e| e}.select{ |k, v| k[:name].size >=3}.reject
这可能有助于:

arr = [
    {:name=>"John Doe1", :number=>"5551234567"},
    {:name=>"John Doe1", :number=>"5551234567"},
    {:name=>"John Doe2", :number=>"5557654321"},
    {:name=>"John Doe1", :number=>"5551234567"}
]
p arr.reject { |hsh| arr.count(hsh) > 2 }
# => [{:name=>"John Doe2", :number=>"5557654321"}]
根据评论,添加以下用法:

这可能有助于:

arr = [
    {:name=>"John Doe1", :number=>"5551234567"},
    {:name=>"John Doe1", :number=>"5551234567"},
    {:name=>"John Doe2", :number=>"5557654321"},
    {:name=>"John Doe1", :number=>"5551234567"}
]
p arr.reject { |hsh| arr.count(hsh) > 2 }
# => [{:name=>"John Doe2", :number=>"5557654321"}]
根据评论,添加以下用法:

这是O(n),在更大的列表中可能会做得更好:

a.group_by { |el| el[:name] }.reject { |_, v| v.size > 2 }.values.flatten
这是O(n),在更大的列表中可能会做得更好:

a.group_by { |el| el[:name] }.reject { |_, v| v.size > 2 }.values.flatten

整个答案是根据@CarySwoveland的灵感重新编写的(对于以前的实现,请随时查看编辑)

这两个选项似乎是处理这种情况最有效的方法

a.group_by { |el| el[:name] }.each_with_object([]) do |(_, v),obj| 
  obj.concat(v) if v.size < 3 
end
#or 
a.group_by { |el| el[:name] }.flat_map { |_, v| v if v.size < 3 }.compact
a.group_by{| el | el[:name]}。每个_与_object([])do |(|,v),obj |
如果v.尺寸小于3,则为obj.concat(v)
终止
#或
a、 按{| el | el[:name]}分组。平面图{| |,v | v如果v.size<3}。紧凑

整个答案是根据@CarySwoveland的灵感重新编写的(对于以前的实现,请随时查看编辑)

这两个选项似乎是处理这种情况最有效的方法

a.group_by { |el| el[:name] }.each_with_object([]) do |(_, v),obj| 
  obj.concat(v) if v.size < 3 
end
#or 
a.group_by { |el| el[:name] }.flat_map { |_, v| v if v.size < 3 }.compact
a.group_by{| el | el[:name]}。每个_与_object([])do |(|,v),obj |
如果v.尺寸小于3,则为obj.concat(v)
终止
#或
a、 按{| el | el[:name]}分组。平面图{| |,v | v如果v.size<3}。紧凑

假设我们给出了以下数组(与问题中给出的数组不同)

我们可以得到如下所示的期望值

arr.values_at(*arr.each_with_index.with_object({}) { |(g,i),h| (h[g] ||= []) << i }.
    values.
    select { |a| a.size < 3 }.
    flatten.
    sort)
  #=> [{:name=>"John Doe3", :number=>"5551234567"},
  #    {:name=>"John Doe2", :number=>"5557654321"},
  #    {:name=>"John Doe3", :number=>"5551234567"}]
enum0 = arr.each_with_index
  #=> #<Enumerator: [{:name=>"John Doe1", :number=>"5551234567"},
  #                  {:name=>"John Doe3", :number=>"5551234567"},
  #                   ...
  #                  {:name=>"John Doe1", :number=>"5551234567"}]:each_with_index>
enum1 = enum0.with_object({})
  #=> #<Enumerator:
  #     #<Enumerator: [{:name=>"John Doe1", :number=>"5551234567"},
  #                    {:name=>"John Doe3", :number=>"5551234567"},
  #                    ...
  #                    {:name=>"John Doe1", :number=>"5551234567"}]:each_with_index>
  #   :with_object({})>
b = enum1.each { |(g,i),h| (h[g] ||= []) << i }
  #=> {{:name=>"John Doe1", :number=>"5551234567"}=>[0, 2, 5],
  #    {:name=>"John Doe3", :number=>"5551234567"}=>[1, 4],
  #    {:name=>"John Doe2", :number=>"5557654321"}=>[3]}
c = b.values
  #=> [[0, 2, 5], [1, 4], [3]]
d = c.select { |a| a.size < 3 }
  #=> [[1, 4], [3]]
f = e.sort
  #=> [1, 3, 4]
arr.values_at(*f)
  #=> [{:name=>"John Doe3", :number=>"5551234567"},
  #    {:name=>"John Doe2", :number=>"5557654321"},
  #    {:name=>"John Doe3", :number=>"5551234567"}]
arr.values_at(*arr.each_,with_index.with_object({}){(g,i),h{(h[g]|{124;=[])[{:name=>“John Doe3”,:number=>“5551234567”},
#{:name=>“John Doe2”,:number=>“5557654321”},
#{:name=>“johndoe3”,:number=>“5551234567”}]
步骤如下

arr.values_at(*arr.each_with_index.with_object({}) { |(g,i),h| (h[g] ||= []) << i }.
    values.
    select { |a| a.size < 3 }.
    flatten.
    sort)
  #=> [{:name=>"John Doe3", :number=>"5551234567"},
  #    {:name=>"John Doe2", :number=>"5557654321"},
  #    {:name=>"John Doe3", :number=>"5551234567"}]
enum0 = arr.each_with_index
  #=> #<Enumerator: [{:name=>"John Doe1", :number=>"5551234567"},
  #                  {:name=>"John Doe3", :number=>"5551234567"},
  #                   ...
  #                  {:name=>"John Doe1", :number=>"5551234567"}]:each_with_index>
enum1 = enum0.with_object({})
  #=> #<Enumerator:
  #     #<Enumerator: [{:name=>"John Doe1", :number=>"5551234567"},
  #                    {:name=>"John Doe3", :number=>"5551234567"},
  #                    ...
  #                    {:name=>"John Doe1", :number=>"5551234567"}]:each_with_index>
  #   :with_object({})>
b = enum1.each { |(g,i),h| (h[g] ||= []) << i }
  #=> {{:name=>"John Doe1", :number=>"5551234567"}=>[0, 2, 5],
  #    {:name=>"John Doe3", :number=>"5551234567"}=>[1, 4],
  #    {:name=>"John Doe2", :number=>"5557654321"}=>[3]}
c = b.values
  #=> [[0, 2, 5], [1, 4], [3]]
d = c.select { |a| a.size < 3 }
  #=> [[1, 4], [3]]
f = e.sort
  #=> [1, 3, 4]
arr.values_at(*f)
  #=> [{:name=>"John Doe3", :number=>"5551234567"},
  #    {:name=>"John Doe2", :number=>"5557654321"},
  #    {:name=>"John Doe3", :number=>"5551234567"}]
enum0=arr.each_与_索引
#=>#“John Doe1”,:number=>“5551234567”,
#{:name=>“johndoe3”,:number=>“5551234567”},
#                   ...
#{:name=>“johndoe1”,:number=>“5551234567”}]:每个索引>
enum1=enum0.with_对象({})
#=> #"5551234567"},
#{:name=>“johndoe3”,:number=>“5551234567”},
#                    ...
#{:name=>“johndoe1”,:number=>“5551234567”}]:每个索引>
#:带_对象({})>
b=enum1.each{(g,i),h{(h[g]|=[]){{{:name=>“johndoe1”,“number=>”5551234567}=>[0,2,5],
#{:name=>“johndoe3”,:number=>“5551234567”}=>[1,4],
#{:name=>“John Doe2”,:number=>“5557654321”}=>[3]}
c=b.值
#=> [[0, 2, 5], [1, 4], [3]]
d=c.选择{| a | a.大小<3}
#=> [[1, 4], [3]]
f=e.sort
#=> [1, 3, 4]
(*f)处的阵列值
#=>[{:name=>“John Doe3”,:number=>“5551234567”},
#{:name=>“John Doe2”,:number=>“5557654321”},
#{:name=>“johndoe3”,:number=>“5551234567”}]

假设我们给出了以下数组(与问题中给出的数组不同)

我们可以得到如下所示的期望值

arr.values_at(*arr.each_with_index.with_object({}) { |(g,i),h| (h[g] ||= []) << i }.
    values.
    select { |a| a.size < 3 }.
    flatten.
    sort)
  #=> [{:name=>"John Doe3", :number=>"5551234567"},
  #    {:name=>"John Doe2", :number=>"5557654321"},
  #    {:name=>"John Doe3", :number=>"5551234567"}]
enum0 = arr.each_with_index
  #=> #<Enumerator: [{:name=>"John Doe1", :number=>"5551234567"},
  #                  {:name=>"John Doe3", :number=>"5551234567"},
  #                   ...
  #                  {:name=>"John Doe1", :number=>"5551234567"}]:each_with_index>
enum1 = enum0.with_object({})
  #=> #<Enumerator:
  #     #<Enumerator: [{:name=>"John Doe1", :number=>"5551234567"},
  #                    {:name=>"John Doe3", :number=>"5551234567"},
  #                    ...
  #                    {:name=>"John Doe1", :number=>"5551234567"}]:each_with_index>
  #   :with_object({})>
b = enum1.each { |(g,i),h| (h[g] ||= []) << i }
  #=> {{:name=>"John Doe1", :number=>"5551234567"}=>[0, 2, 5],
  #    {:name=>"John Doe3", :number=>"5551234567"}=>[1, 4],
  #    {:name=>"John Doe2", :number=>"5557654321"}=>[3]}
c = b.values
  #=> [[0, 2, 5], [1, 4], [3]]
d = c.select { |a| a.size < 3 }
  #=> [[1, 4], [3]]
f = e.sort
  #=> [1, 3, 4]
arr.values_at(*f)
  #=> [{:name=>"John Doe3", :number=>"5551234567"},
  #    {:name=>"John Doe2", :number=>"5557654321"},
  #    {:name=>"John Doe3", :number=>"5551234567"}]
arr.values_at(*arr.each_,with_index.with_object({}){(g,i),h{(h[g]|{124;=[])[{:name=>“John Doe3”,:number=>“5551234567”},
#{:name=>“John Doe2”,:number=>“5557654321”},
#{:name=>“johndoe3”,:number=>“5551234567”}]
步骤如下

arr.values_at(*arr.each_with_index.with_object({}) { |(g,i),h| (h[g] ||= []) << i }.
    values.
    select { |a| a.size < 3 }.
    flatten.
    sort)
  #=> [{:name=>"John Doe3", :number=>"5551234567"},
  #    {:name=>"John Doe2", :number=>"5557654321"},
  #    {:name=>"John Doe3", :number=>"5551234567"}]
enum0 = arr.each_with_index
  #=> #<Enumerator: [{:name=>"John Doe1", :number=>"5551234567"},
  #                  {:name=>"John Doe3", :number=>"5551234567"},
  #                   ...
  #                  {:name=>"John Doe1", :number=>"5551234567"}]:each_with_index>
enum1 = enum0.with_object({})
  #=> #<Enumerator:
  #     #<Enumerator: [{:name=>"John Doe1", :number=>"5551234567"},
  #                    {:name=>"John Doe3", :number=>"5551234567"},
  #                    ...
  #                    {:name=>"John Doe1", :number=>"5551234567"}]:each_with_index>
  #   :with_object({})>
b = enum1.each { |(g,i),h| (h[g] ||= []) << i }
  #=> {{:name=>"John Doe1", :number=>"5551234567"}=>[0, 2, 5],
  #    {:name=>"John Doe3", :number=>"5551234567"}=>[1, 4],
  #    {:name=>"John Doe2", :number=>"5557654321"}=>[3]}
c = b.values
  #=> [[0, 2, 5], [1, 4], [3]]
d = c.select { |a| a.size < 3 }
  #=> [[1, 4], [3]]
f = e.sort
  #=> [1, 3, 4]
arr.values_at(*f)
  #=> [{:name=>"John Doe3", :number=>"5551234567"},
  #    {:name=>"John Doe2", :number=>"5557654321"},
  #    {:name=>"John Doe3", :number=>"5551234567"}]
enum0=arr.each_与_索引
#=>#“John Doe1”,:number=>“5551234567”,
#{:name=>“johndoe3”,:number=>“5551234567”},
#                   ...
#{:name=>“johndoe1”,:number=>“5551234567”}]:每个索引>
enum1=enum0.with_对象({})
#=> #"5551234567"},
#{:name=>“johndoe3”,:number=>“5551234567”},
#                    ...
#{:name=>“johndoe1”,:number=>“5551234567”}]:每个索引>
#:带_对象({})>
b=enum1.each{(g,i),h{(h[g]|=[]){{{:name=>“johndoe1”,“number=>”5551234567}=>[0,2,5],
#{:name=>“johndoe3”,:number=>“5551234567”}=>[1,4],
#{:name=>“John Doe2”,:number=>“5557654321”}=>[3]}
c=b.值
#=> [[0, 2, 5], [1, 4], [3]]
d=c.选择{| a | a.大小<3}
#=> [[1, 4], [3]]
f=e.sort
#=> [1, 3, 4]
(*f)处的阵列值
#=>[{:name=>“John Doe3”,:number=>“5551234567”},
#{:name=>“John Doe2”,:number=>“5557654321”},
#{:name=>“johndoe3”,:number=>“5551234567”}]

我只需要重复的名称计数。上面的代码认为名称和数字根本不是问题。只需一个额外的操作,几乎相同。这里使用
count
效率相对较低,因为它必须对数组的每个元素重复,使其计算复杂度为O(n^2).我相信你知道有很多方法可以计算出O(n)。我只需要重复的名称计数。上面的代码认为名称和编号根本不是问题。只需一个附加操作,几乎相同。此处使用
count
效率相对较低,因为必须对数组的每个元素重复此操作,使其计算复杂性为O(n^2).我相信你知道有很多方法可以计算出O(n)。使用
count
效率相对较低。请参阅@Sebastain的答案上的我的commnet。@CarySwoveland感谢您的启发。我已完全更新了我的答案,并且两个选项都比根据果味发布的所有其他答案更有效。使用
count
效率相对较低。请参阅@Sebastain的ans上的我的commnetwer@CarySwoveland谢谢你的启发。我已经完全更新了我的答案,并且两个选项都比根据fruity发布的所有其他答案更有效。这不会保留给定数组元素的顺序。这不会保留给定数组元素的顺序。