Ruby [已解决] ruby 在数组中通过一个元素找到下一个元素

simlegate · 2012年12月11日 · 最后由 xranthoar 回复于 2012年12月17日 · 4810 次阅读

比如说

def get_next current
  a = %w[a b c d e f]
  # .......(实现通过current找到下一个元素)
end
get_next('b')  # 怎么才能得到c

解决办法:请移步到 2 楼,21 楼,27 楼!

1 楼 已删除
def get_next(current)
  a = %w[a b c d e f]
  a[a.index(current)+1]
end
get_next('b') #=> "c"

#2 楼 @fredwu 谢谢,你的做法我和我一样,我觉得不简洁,所以想换种方法

a.drop_while { |n| n != 'b' }[1]

=。=

#1 楼 @fresh_fish 主要是我不知道索引,只知道具体的值

#6 楼 @simlegate 那个也不对~ :)

一定要走上 '茴' 字这条路吗? :)

应用场景是啥?大部分需要看上一个/下一个元素的话 each_cons(2) 就解决了...

而且有重复元素怎么办?a = %w[a b a c] 的话 get_next('a') 总是返回 'b' ...

#7 楼 @fresh_fish a.delete("b").next 你看这个行不?

#9 楼 @luikore 我用的数组里面没有重复的!知道数组中的一个值,想通过这个值去找下一个值。

#13 楼 @sevk 愚钝,不知道怎么用?

Enumerator.next 好像不能直接用,按 2 楼的方法吧:

class Array
   def get_next_of(a)
     self[self.index(a)+1]
   end
end

a=[3,2,'1' ]
p a.get_next_of(2) #=> "1"

get_next('f') 。。。

get_next('g')

2 楼的算法有问题吧。异常

17 楼 已删除

#16 楼 @ihlayy 算法应该是没问题的。

#16 楼 @ihlayy 这样写:


class NilClass
   def + n
      0
   end
end

class Array
   def get_next_of(i)
     self[ self.index(i)+1 ]
   end
end

a=[3,2,'1' ]
p a.get_next_of(2) #=> "1"
p a.get_next_of(-2) #=> 3
20 楼 已删除
def get_next x
  Hash[%w[a b c d e f].each_cons(2).to_a][x]
end

#11 楼 @simlegate

你有一个数组和里面的一个元素,想找下一个,可能你的代码是这个样子的?

a.each do |e|
  next_e = get_next(e)
  ...
end

还不如改改思路,变成这样:

a.each_cons 2 do |e, next_e|
  ...
end

#21 楼 @luikore 好主意:

a.each_cons 2 do |e, next_e|
  ...
end

#21 楼 @luikore 谢谢!这种方法是可以的

a.each_cons 2 do |e, next_e|
  ...
end

如果我用这种方法的时候我不知道用什么语法(return?break?)跳出循环,并且要返回我要得到的值?

#23 楼 @simlegate

这里 break 就可以跳出循环

P.S. 所有 block/lambda 都能 break 的,例如下面这两个:

pow = -> x {
  break 1 if x == 0 # 是不是和 return 1 很像?
  x * pow.(x - 1)
}
pow.(5)
(1..(1/0.0)).inject do |product, x|
  break product if x > 5
  product *= x
end

需要再加入找不到或者边界情况,但思路是这样

def find_next(array, element) array.shift == element ? array.shift : find_next(array, element) end

#24 楼 @luikore 原来是 break 也可以返回值呀!这还真不知道!

没有重复的话随便怎么搞都可以啦,给个正则的方式~

def find_next(a,e) 
     a.join =~ /#{e}(.)/ ? $1 : e
end

#27 楼 @gingerhot 正则一点不懂,还请解释!

#28 楼 @simlegate 上面的是针对单字符的情况。所以如果用正则来做的话通用性会差些,比如你的元素中如果没有“-",你可以:

def find_next(a,e) 
     a.join('-') =~ /#{e}-([^-]*)/ ? $1 : e
end

如果不懂正则那就只有学一下或是用其它方法啦~

就用 index 方法吧。。这种 builtin 的东西效率更可能得到优化,毕竟在代码量和效率上选择效率吧。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号