Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
比较除元素x、y、z(ruby)之外的两个数组_Ruby_Arrays_Comparison - Fatal编程技术网

比较除元素x、y、z(ruby)之外的两个数组

比较除元素x、y、z(ruby)之外的两个数组,ruby,arrays,comparison,Ruby,Arrays,Comparison,还有其他更简单、更好的方法吗 require 'pp' a1 = ["02/28/10","Webinars","131","0","26 Feb 2010","0","3d, 8h, 49m, 18s"] a2 = ["02/20/10","Webinars","131","9","26 Feb 2010","0","3d, 8h, 49m, 18s"] def compare(array1,array2,ignore) tmp1 = Array.new tmp2 = Array

还有其他更简单、更好的方法吗

require 'pp'

a1 = ["02/28/10","Webinars","131","0","26 Feb 2010","0","3d, 8h, 49m, 18s"]
a2 = ["02/20/10","Webinars","131","9","26 Feb 2010","0","3d, 8h, 49m, 18s"]

def compare(array1,array2,ignore)

  tmp1 = Array.new
  tmp2 = Array.new
  0.upto(array1.length-1) {|index|
    if !ignore.include?(index)
      tmp1 << array1[index]
      tmp2 << array2[index]
    end
  }
  if tmp1 == tmp2 
    return true
  else
    return false    
  end
end

pp a1
pp a2
puts
puts compare(a1,a2,[0,3])
我觉得这样更好:):

它的美妙之处在于,它通过索引将
每个\u与
all?
链接起来,使代码更加清晰。

糟糕的是,它只能在Ruby 1.8上运行。7。无论如何,我不认为有理由使用<1.8.7

可能有很多更简洁的方法。这是我想到的第一个问题,我相信这是可以改进的

def compare(array1, array2, ignore)
  return false if array1.size != array2.size
  0.upto(array1.size) do |i|
    return false if !ignore.include?(i) && array1[i] != array2[i]
  end
  return true
end
本质上,是一种手动数组比较。检查相同的大小,然后逐个检查元素(但忽略我们被告知要忽略的索引)。一旦我们知道继续下去毫无意义,就立即中断。

最简单的代码(需要Ruby 1.8.7或更高版本):

我怀疑它也会更快(因为它使用一个zip,而不是单独询问每个项目的数组)——尽管这可能不是速度非常重要的情况

顺便说一句,几乎任何时候我都直接在Ruby中索引数组(比如
some_array[I]
),而不是使用更高阶的方法,比如
map
each
,我认为这是一个信号,表明我可能在标准库中遗漏了一些东西,并且该算法的效率可能会低于高度优化的库函数。

这又如何

require 'enumerator'
def compare (a1, a2, i)
  a1.size == a2.size and
    ( a1.enum_for(:each_with_index).select{ |v, j| !i.include?(j)} ==
      a2.enum_for(:each_with_index).select{ |v, j| !i.include?(j)} )

end

compare([1,2,3,4,5], [1,7,6,4,5], [1,2]) #true
compare([1,2,3,4,5], [1,7,6,4,5], [1,2]) #true
注意 这将在Ruby 1.8.6中工作。您可以使用Dmitry Nagirnyak的方法进一步优化:

def compare (a1, a2, i)
  a1.size == a2.size and
    a1.enum_for(:each_with_index).all?{|v, j| a2[j] == v or i.include?(j)}
end

下面是1.9的一个解决方案,它比较了<和>以及==:

#!/usr/bin/ruby1.9

# Return -1 if array1 < array2
#         0 if array1 == array2
#        +1 if array1 > array2
# ignore contains indices of elements to ignore

def compare(array1, array2, ignore)
  filter = lambda do |a|
    a.collect.with_index do |e, i|
      if ignore.include?(i)
        ''
      else
        e
      end
    end
  end
  filter[array1] <=> filter[array2]
end

array1 = ["02/28/10","Webinars","131","0","26 Feb 2010","0","3d, 8h, 49m, 18s"]
array2 = ["02/20/10","Webinars","131","9","26 Feb 2010","0","3d, 8h, 49m, 18s"]

p compare(array1, array2, [0, 3])    # => 0
p compare(array1, array2, [0])       # => -1
p compare(array1, array2, [3])       # => 1
#/usr/bin/ruby1.9
#如果阵列1<阵列2,则返回-1
#如果array1==array2,则为0
#如果阵列1>阵列2,则为+1
#ignore包含要忽略的元素的索引
def比较(阵列1、阵列2、忽略)
过滤器=λdo | a|
a、 collect.with_index do | e,i|
如果忽略。包括?(i)
''
其他的
E
结束
结束
结束
过滤器[array1]过滤器[array2]
结束
数组1=[“02/28/10”,“网络研讨会”,“131”,“0”,“2010年2月26日”,“0”,“3d,8小时,49米,18秒”]
array2=[“02/20/10”,“网络研讨会”,“131”,“9”,“2010年2月26日”,“0”,“3d,8小时,49米,18秒”]
p比较(array1,array2,[0,3])#=>0
p比较(数组1,数组2,[0])#=>-1
p比较(数组1,数组2,[3])#=>1

这里还有一个,简洁而低效:

def compare a1, a2, i
  [a1,a2].map { |a|
    a.values_at(*((0...a.length).to_a - i))
  }.inject(&:==)
end


我不喜欢这会改变原始数组。@Dmitry Nagirnyak:您的代码给了我一个错误'each_with_index':没有给出块(LocalJumpError),但最重要的是,我已经尝试过了。(i)处的delete_会导致ignore数组中的第二个元素不正确,因为索引将更改。它还将修改作为参数传递的原始数组。当然我可以使用一些tmp数组;但愿我能把它放回去。这将在
比较([1,2],[1,2,3],])时返回假阳性。
我已更新了答案,以不改变数组。它适合我(Ruby 1.8.7)。数组
[1,2]
[1,2,3]
不应该相等。当前的方法并没有检查这一点(如果需要,很容易做到,但我还没有观察到这样的要求)。反正我会更新的。好的。运行这个
compare([1,2],[1,2,3],])
的定义,它显然应该是false,并且返回
true
@Matchu:great!它工作得非常好:-)我只需要再澄清一次就可以理解您的代码了。一旦函数compare命中任何一个返回值,它就不会继续运行代码,而是退出该函数。是吗?没错:)一旦知道函数将返回什么,我就不想再运行任何检查了。@Matchu:为什么“使用do/end而不是方括号”?@Radek,我介意回答。这是Ruby中的常见约定:单行块使用
{}
,多行-
do end
谢谢你。每一天,每一天,一个人都在学习新的东西你需要什么价值?如果希望匹配时为false,则对结果求反。当数组具有重复值时不起作用。让我来修正,我修正了逻辑。看一看。现在它给了我
未定义的方法enum_for#(NoMethodError)
您需要
要求使用“枚举器”
。我已经将它添加到code.FYI中,问题中的版本总是返回true,因为tmp1和tmp2指向同一个数组。尝试比较([0],[1],])谢谢您指出这一点。已修复。很好。我忽略了Ruby中的
zip
。但是
all?
的带有3个参数的块从何而来。下面的代码为我写
nil
,这意味着
a
是一个元素,
b
是一个索引<未定义代码>idx
[1,2]。zip(['a',b'])。每个\u都有\u索引。全部?{| a,b,idx | puts idx;true}
def compare (a1, a2, i)
  a1.size == a2.size and
    a1.enum_for(:each_with_index).all?{|v, j| a2[j] == v or i.include?(j)}
end
#!/usr/bin/ruby1.9

# Return -1 if array1 < array2
#         0 if array1 == array2
#        +1 if array1 > array2
# ignore contains indices of elements to ignore

def compare(array1, array2, ignore)
  filter = lambda do |a|
    a.collect.with_index do |e, i|
      if ignore.include?(i)
        ''
      else
        e
      end
    end
  end
  filter[array1] <=> filter[array2]
end

array1 = ["02/28/10","Webinars","131","0","26 Feb 2010","0","3d, 8h, 49m, 18s"]
array2 = ["02/20/10","Webinars","131","9","26 Feb 2010","0","3d, 8h, 49m, 18s"]

p compare(array1, array2, [0, 3])    # => 0
p compare(array1, array2, [0])       # => -1
p compare(array1, array2, [3])       # => 1
def compare a1, a2, i
  [a1,a2].map { |a|
    a.values_at(*((0...a.length).to_a - i))
  }.inject(&:==)
end