【问题标题】:Loop around an array forward and backward向前和向后循环数组
【发布时间】:2019-08-10 09:41:00
【问题描述】:

这是我从给定索引向前循环的函数。我正在寻找一种从 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'

我有对应的向后循环。

有更好的方法吗?

【问题讨论】:

  • 这里的number 是什么?它没有显示。
  • 如果number 不是数组的元素怎么办?你会得到一个错误。
  • 抱歉更正
  • 什么是arrs

标签: arrays ruby loops


【解决方案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'

【讨论】:

  • enum.each_cons(2).find {|a,_| a == letter}.last 也很好,避免了loopbreak
  • @engineersmnky 使用each_cons 的好主意,使用find 更符合语义。
  • 是的,如果您想双向走,那么each_cons(3) 并检查中间作为支点。
【解决方案2】:

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

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

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

您可以使用 ziprotate 从数组轻松构建此类哈希:

arr = %w[a b c d]
#=> ["a", "b", "c", "d"]

hash = arr.zip(arr.rotate).to_h
#=> {"a"=>"b", "b"=>"c", "c"=>"d", "d"=>"a"}

invert 向后移动的哈希:

hash.invert
#=> {"b"=>"a", "c"=>"b", "d"=>"c", "a"=>"d"}

【讨论】:

    【解决方案3】:
    def forward(letter)
      arr = ['a','b','c','d']
      i = arr.find_index(letter)
      arr[(i + 1) % arr.length]
    end
    

    【讨论】:

    • 这只是简单地返回元素本身。 arr[i % arr.length] 应该是 arr[(i + 1) % arr.length] 对于另一个方向只需使用 i - 1 其余的可以保持不变。
    【解决方案4】:

    像这样?

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

    【讨论】:

    • 是的!谢谢你,有什么办法可以告诉它反过来吗? 4, 3 , 2 ,1 然后回到 4?或者你会建议我有一个单独的数组吗?
    • 实际上这只适用于数字,也许这不是我想要的
    • def backward(number); forward(-number); end 无论数组的内容如何,​​这都有效。
    • @draganstankovic 我相信这条评论“实际上这只适用于数字,也许这不是我想要的”是指 OP 不能调用 forward('a') 的事实,因为这会引发TypeError no implicit conversion of String into Integer 因为'a' % 4 将使用String#% 而不是因此返回String
    • 我现在看到了问题的更新。这段时间很忙,但似乎其他人都知道了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多