前后循环遍历数组

时间:2019-03-19 18:53:09

标签: arrays ruby loops

这是我从给定索引向前循环的功能。我正在寻找一种行为,从1变为2,再从3变为4,然后回到1,然后重复。

def forward(letter)
  arr = ['a', 'b', 'c', 'd']
  if arr.find_index(letter) < 3
    arr[arr.find_index(letter) + 1]
  elsif arr.find_index(letter) == 3
    arr[0]
  end
end

forward('d') # => 'a'
forward('b') # => 'c'

而且我有对方可以向后循环。

有更好的方法吗?

4 个答案:

答案 0 :(得分:4)

可以使用散列代替每次搜索数组:

RuntimeException

您可以使用ziprotate从数组轻松构建这样的哈希:

RuntimeException

invert哈希向后移动:

def forward(letter)
  {'a'=>'b', 'b'=>'c', 'c'=>'d', 'd'=>'a'}[letter]
end

forward('d') #=> "a"
forward('b') #=> "c"

答案 1 :(得分:2)

def forward(letter)
  arr = ['a','b','c','d']
  i = arr.find_index(letter)
  arr[(i + 1) % arr.length]
end

答案 2 :(得分:1)

执行此操作的另一种方法是使用循环枚举器和循环。

def forward letter
  enum = ['a', 'b', 'c', 'd'].cycle
  loop {
    n = enum.next
    break enum.peek if n == letter
  }
end

forward 'a' #=> 'b'
forward 'b' #=> 'c'
forward 'c' #=> 'd'
forward 'd' #=> 'a'

答案 3 :(得分:0)

喜欢吗?

def forward(number)
  arr = [1, 2, 3, 4]
  return arr[number % arr.size]
end