我认为这很简单,但我似乎把事情弄得一团糟,而且我还没有在stackoverflow上发现任何与我的问题相符的东西。
我试图编写一个可以比较两个文件名数组的函数,以确保它们的值匹配。他们需要实际匹配他们的位置,所以顺序是至关重要的。换句话说:
array1 = ["file1.html", "file2.html", "file3.html", "file4.html"]
array2 = ["file1.html", "file2.html", "file4.html", "file3.html"]
我希望这两个数组之间的比较返回为false,因为顺序不同(即使两个数组实际上包含相同的值)。我试过这样的事情:
matching = true
names1 = array1.map { |x| File.basename(x)}
names2 = array2.map { |x| File.basename(x)}
names1.each_with_index { |file,index|
if file != names2[index]
matching = false
end
}
return matching
这很有效,但我想知道这种方式比较数组是否更简洁,更简单?谢谢!
答案 0 :(得分:5)
你不需要做任何类似的事情。默认数组相等运算符将数组与顺序
进行比较array1 = %w[file1.html file2.html file3.html file4.html]
array2 = %w[file1.html file2.html file4.html file3.html]
array3 = %w[file1.html file2.html file3.html file4.html]
array1 == array2 # => false
array1 == array3 # => true
比较映射值的示例(如果数组中有完整路径)
array1.map{|a| File.basename(a)} == array2.map{|a| File.basename(a) }
# or, as @mudasobwa would suggest
[array1, array2].map{|a| a.map(&File.method(:basename)) }.reduce(:==)
使用最后一个,当且仅当a)你完全理解它并且b) 你认为这是一个好主意。