Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何在给定数组中某个元素的情况下查找下一个元素_Ruby_Arrays - Fatal编程技术网

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项,这应该是微不足道的。不过,很高兴知道。