你有一个具有两个索引的ruby for循环吗? 即:
for i,j in 0..100
do something
end
在Google中找不到任何内容
编辑:添加更多细节
我需要比较两个不同的数组,比如
Index: Array1: Array2:
0 a a
1 a b
2 a b
3 a b
4 b b
5 c b
6 d b
7 d b
8 e c
9 e d
10 e d
11 e
12 e
但知道他们都有相同的物品(abcde) 这是我伪的逻辑,让我们假设整个事情都在一个循环中
#tese two if states are for handling end-of-array cases
If Array1[index_a1] == nil
Errors += Array1[index_a1-1]
break
If Array2[index_a1] == nil
Errors += Array2[index_a2-1]
break
#this is for handling mismach
If Array1[index_a1] != Array2[index_a2]
Errors += Array1[index_a1-1] #of course, first entry of array will always be same
if Array1[index_a1] != Array1[index_a1 - 1]
index_a2++ until Array1[index_a1] == Array2[index_a2]
index_a2 -=1 (these two lines are for the loop's sake in next iteration)
index_a1 -=1
if Array2[index_a2] != Array2[index_a2 - 1]
index_a1++ until Array1[index_a1] == Array2[index_a2]
index_a2 -=1 (these two lines are for the loop's sake in next iteration)
index_a1 -=1
简而言之,在上面的例子中,
Errors looks like this
a,b,e
因为c和d都很好。
答案 0 :(得分:3)
您可以使用枚举器而不是数字索引迭代两个数组。此示例同时迭代a1
和a2
,回显a2
中以a1
中相应字母开头的第一个单词,跳过a2
中的重复项:< / p>
a1 = ["a", "b", "c", "d"]
a2 = ["apple", "angst", "banana", "clipper", "crazy", "dizzy"]
e2 = a2.each
a1.each do |letter|
puts e2.next
e2.next while e2.peek.start_with?(letter) rescue nil
end
(它假设a1
中的所有字母在a2
中至少有一个单词并且两者都已排序 - 但您明白了。)
答案 1 :(得分:2)
for循环不是在Ruby中迭代数组的最佳方法。通过澄清你的问题,我认为你有一些可能的策略。
你有两个数组,a和b。 如果两个数组的长度相同:
a.each_index do |index|
if a[index] == b[index]
do something
else
do something else
end
end
如果A比B短,这也有效。
如果你不知道哪一个更短,你可以写一些类似的东西:
controlArray = a.length < b.length ? a : b
分配controlArray,使用controlArray.each_index。或者您可以使用(0..[a.length, b.length].min).each{|index| ...}
来完成同样的事情。
查看您对问题的编辑,我想我可以这样改写:给定一个带有重复项的数组,如何获得每个数组中每个项目的计数并比较计数?在你的情况下,我认为最简单的方法就是这样:
a = [:a,:a,:a,:b,:b,:c,:c,:d,:e,:e,:e]
b = [:a,:a,:b,:b,:b,:c,:c,:c,:d,:e,:e,:e]
not_alike = []
a.uniq.each{|value| not_alike << value if a.count(value) != b.count(value)}
not_alike
运行该代码会给我[:a,:b,:c]
。
如果a可能不包含每个符号,那么你需要有一个只包含符号的数组,并使用它而不是a.uniq,条件中的另一个and
语句可以处理没有或0计数。
答案 2 :(得分:0)
这两个数组是相同的,除了一些元素,我必须在/或每隔一段时间跳过
不是在迭代期间跳过,你可以预先选择不可跳过的吗?
a.select{ ... }.zip( b.select{ ... } ).each do |a1,b1|
# a1 is an entry from a's subset
# b1 is the paired entry bfrom b's subset
end