Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 比较数组中多个散列的值_Ruby_Arrays_For Loop_Hash - Fatal编程技术网

Ruby 比较数组中多个散列的值

Ruby 比较数组中多个散列的值,ruby,arrays,for-loop,hash,Ruby,Arrays,For Loop,Hash,我知道应该避免for循环,我想迭代数组的更好方法是 for i in 0..array.size-1 do puts array[i] end 做 但是如果我有一个散列数组,比如 array = [{:value0 => 1, :value1 => 0}, {:value0 => 2, :value1 => 1}, {:value0 => 1, :value1 => 2}] 并希望检查:value0在所有哈希中是否唯一。。直觉上我会做类似的事情 for

我知道应该避免for循环,我想迭代数组的更好方法是

for i in 0..array.size-1 do
  puts array[i]
end

但是如果我有一个散列数组,比如

array = [{:value0 => 1, :value1 => 0}, {:value0 => 2, :value1 => 1}, {:value0 => 1, :value1 => 2}]
并希望检查:value0在所有哈希中是否唯一。。直觉上我会做类似的事情

for i in 0..array.size-1 do
  _value_buffer = array[i][:value0]
  for j in i+1..array.size-1 do
    if _value_buffer == array[j][:value0]
      puts "whatever"
    end
  end
end

有更好的方法吗?

以下是我的方法:

2.0.0p195 :001 > array = [{:value0 => 1, :value2 => 0}, {:value0 => 2, :value2 => 1}, {:value0 => 1, :value2 => 2}]
 => [{:value0=>1, :value2=>0}, {:value0=>2, :value2=>1}, {:value0=>1, :value2=>2}] 
2.0.0p195 :002 > val0 = array.map { |hash| hash[:value0] }
 => [1, 2, 1] 
2.0.0p195 :003 > puts val0.uniq == val0
false
 => nil

我将收集:value0的值,然后将它们与唯一值数组进行比较。

以下是我将如何操作:

2.0.0p195 :001 > array = [{:value0 => 1, :value2 => 0}, {:value0 => 2, :value2 => 1}, {:value0 => 1, :value2 => 2}]
 => [{:value0=>1, :value2=>0}, {:value0=>2, :value2=>1}, {:value0=>1, :value2=>2}] 
2.0.0p195 :002 > val0 = array.map { |hash| hash[:value0] }
 => [1, 2, 1] 
2.0.0p195 :003 > puts val0.uniq == val0
false
 => nil

我会收集:value0的值,然后将它们与唯一值数组进行比较。

为什么不直接获取所有有问题的值,看看它们是否唯一

!array.map { |h| h[:value0] }.uniq!

当没有重复项时返回nil

为什么不获取所有有问题的值并查看它们是否唯一

!array.map { |h| h[:value0] }.uniq!

当没有重复项时返回nil

正如Andrew Marshall所说,您可以使用uniq!,但用更简洁的方式:

!array.uniq!{|a| a[:value0]}

正如Andrew Marshall所说,您可以使用uniq!,但用更简洁的方式:

!array.uniq!{|a| a[:value0]}

您要1号的吗?还是数组的长度?这是一个很好的解决方案。@guy你说得对,但我将完全绕过它,以使解决方案保持为一个变量,并减少一行:。这非常聪明,我从未真正想过使用破坏性方法+1@andrewmarshall啊,好吧,编辑之前我有点困惑,因为你的答案,但这是非常整洁的-谢谢@我通常避免使用破坏性的方法,但我认为这没关系,因为它位于一个刚刚创建的功能数组上,无论如何都会被丢弃。您希望大小等于1吗?还是数组的长度?这是一个很好的解决方案。@guy你说得对,但我将完全绕过它,以使解决方案保持为一个变量,并减少一行:。这非常聪明,我从未真正想过使用破坏性方法+1@andrewmarshall啊,好吧,编辑之前我有点困惑,因为你的答案,但这是非常整洁的-谢谢@我通常避免使用破坏性的方法,但我认为这没关系,因为它是在一个刚刚创建的函数数组上,无论如何都会被丢弃。哦,顺便说一句,你永远不需要在Ruby中使用for。如果你真的需要索引,你可以使用或者,或者可能是0..array.size-1.times{| i |…}。我会记住的,谢谢!哦,顺便说一句,你永远不需要在Ruby中使用for。如果你真的需要索引,你可以使用或者,或者可能是0..array.size-1.times{| i |…}。我会记住的,谢谢!