Ruby for循环中的两个索引

时间:2012-05-17 14:43:50

标签: ruby for-loop

你有一个具有两个索引的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都很好。

3 个答案:

答案 0 :(得分:3)

您可以使用枚举器而不是数字索引迭代两个数组。此示例同时迭代a1a2,回显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