Ruby 如何在给定数组中某个元素的情况下查找下一个元素
我编写了一个方法来获取数组中给定元素之后的下一个元素。如果我为方法提供Ruby 如何在给定数组中某个元素的情况下查找下一个元素,ruby,arrays,Ruby,Arrays,我编写了一个方法来获取数组中给定元素之后的下一个元素。如果我为方法提供c,我希望它返回e;如果e,我希望它返回a,等等: array = %w[a f c e] def find_element_after(element, array) index = array.find_index(element) + 1 array.at(index) end array.find_element_after("c", array) 如果我传入最后一个元素,我将得到nil。但是我想返回第一
c
,我希望它返回e
;如果e
,我希望它返回a
,等等:
array = %w[a f c e]
def find_element_after(element, array)
index = array.find_index(element) + 1
array.at(index)
end
array.find_element_after("c", array)
如果我传入最后一个元素,我将得到nil
。但是我想返回第一个元素
我可以用
if
和else
解决这个问题。但我想知道Ruby是否有更好的方法?您可以修改您的方法,考虑数组大小,如下所示:
array = %w[a f c e]
def find_element_after(element, array)
index = array.find_index(element) + 1
array.at(index % array.size) # divide calculated index modulo array size
end
find_element_after('e', array)
# => "a"
def find_element_after(element, array)
index = array.find_index(element)
array.at(index + 1) if index
end
如果要使方法证明传递的参数不是数组的成员,可以执行以下操作:
def find_element_after(element, array)
index = array.find_index(element)
array.at((index + 1) % array.size) if index
end
find_element_after('u', array)
# => nil
或:
正如你所看到的,有很多可能的解决方案。请随意试验 您可以根据数组大小修改方法,如下所示:
array = %w[a f c e]
def find_element_after(element, array)
index = array.find_index(element) + 1
array.at(index % array.size) # divide calculated index modulo array size
end
find_element_after('e', array)
# => "a"
def find_element_after(element, array)
index = array.find_index(element)
array.at(index + 1) if index
end
如果要使方法证明传递的参数不是数组的成员,可以执行以下操作:
def find_element_after(element, array)
index = array.find_index(element)
array.at((index + 1) % array.size) if index
end
find_element_after('u', array)
# => nil
或:
正如你所看到的,有很多可能的解决方案。请随意试验 您可以使用以下命令对数组进行迭代:
def find_element_after(element, array)
cons = array.each_cons(2).find { |i1, i2| i1 == element }
cons.nil? ? array.first : cons.last
end
find_element_after('c', array)
# => "e"
find_element_after('e', array)
# => "a"
您可以使用来使用对迭代数组:
def find_element_after(element, array)
cons = array.each_cons(2).find { |i1, i2| i1 == element }
cons.nil? ? array.first : cons.last
end
find_element_after('c', array)
# => "e"
find_element_after('e', array)
# => "a"
如果传入最后一个元素,它实际上是有效的。索引将计算为最后一个索引,从数组中检索
lastindex+1
处的元素将返回nil
问题是当您提供数组中不存在的元素时。这种情况会导致索引
为nil
,然后在调用+1
时抛出NoMethodError
要解决此问题,请按如下方式定义方法:
array = %w[a f c e]
def find_element_after(element, array)
index = array.find_index(element) + 1
array.at(index % array.size) # divide calculated index modulo array size
end
find_element_after('e', array)
# => "a"
def find_element_after(element, array)
index = array.find_index(element)
array.at(index + 1) if index
end
下面是一个演示,展示了它现在是如何工作的():
如果传入最后一个元素,它实际上是有效的。索引将计算为最后一个索引,从数组中检索
lastindex+1
处的元素将返回nil
问题是当您提供数组中不存在的元素时。这种情况会导致索引
为nil
,然后在调用+1
时抛出NoMethodError
要解决此问题,请按如下方式定义方法:
array = %w[a f c e]
def find_element_after(element, array)
index = array.find_index(element) + 1
array.at(index % array.size) # divide calculated index modulo array size
end
find_element_after('e', array)
# => "a"
def find_element_after(element, array)
index = array.find_index(element)
array.at(index + 1) if index
end
下面是一个演示,展示了它现在是如何工作的():
这里有一些其他的方法可以做到这一点 #1使用该方法 我认为这读起来不错,但它的缺点是创建了一个大小为
arr
的临时数组
#2使用数组#旋转
构造哈希
h = Hash[arr.zip(arr.rotate(1))]
#=> {"a"=>"f", "f"=>"c", "c"=>"e", "e"=>"a"}
h['a'] #=> "f"
h['f'] #=> "c"
h['c'] #=> "e"
h['e'] #=> "a"
#3用于创建枚举数
enum = arr.cycle
def nxt(enum, v)
until enum.next == v do
end
enum.next
end
nxt(enum, 'a') #=> "f"
nxt(enum, 'f') #=> "c"
nxt(enum, 'c') #=> "e"
nxt(enum, 'e') #=> "a"
如果要映射多个值,后两种方法应该相对有效。以下是一些其他方法 #1使用该方法 我认为这读起来不错,但它的缺点是创建了一个大小为
arr
的临时数组
#2使用数组#旋转
构造哈希
h = Hash[arr.zip(arr.rotate(1))]
#=> {"a"=>"f", "f"=>"c", "c"=>"e", "e"=>"a"}
h['a'] #=> "f"
h['f'] #=> "c"
h['c'] #=> "e"
h['e'] #=> "a"
#3用于创建枚举器
enum = arr.cycle
def nxt(enum, v)
until enum.next == v do
end
enum.next
end
nxt(enum, 'a') #=> "f"
nxt(enum, 'f') #=> "c"
nxt(enum, 'c') #=> "e"
nxt(enum, 'e') #=> "a"
如果要映射多个值,后两种方法应该相对有效。感谢您指出错误。问题是,当传递最后一个元素时,我永远不想返回nil。我想返回第一个元素,基本上是一个圆。但这很简单,我现在理解了错误。谢谢你指出错误。问题是,当传递最后一个元素时,我永远不想返回nil。我想返回第一个元素,基本上是一个圆。但这很容易,我现在理解了错误。没有必要删掉已更改的文本。如果某些东西没有意义,我们可以看到编辑历史。要考虑的一件事是,随着代码的使用,“<代码>数组/<代码>的大小会增长,因为您使用的是线性搜索。相反,我可能会在管理/维护该散列的自定义类中使用某种链表或散列。键是您搜索的内容,值是下一个元素。这将是一个非常一致的查找速度,插入时间稍微慢一点。@theTinMan感谢您指出这两件事。在这种情况下,我将有可能少于100项,这应该是微不足道的。不过,知道这一点很好。没有必要删掉已更改的文本。如果某些东西没有意义,我们可以看到编辑历史。要考虑的一件事是,随着代码的使用,“<代码>数组/<代码>的大小会增长,因为您使用的是线性搜索。相反,我可能会在管理/维护该散列的自定义类中使用某种链表或散列。键是您搜索的内容,值是下一个元素。这将是一个非常一致的查找速度,插入时间稍微慢一点。@theTinMan感谢您指出这两件事。在这种情况下,我将有可能少于100项,这应该是微不足道的。不过,很高兴知道。