Ruby任务:将数字连接到间隔
我有一个uniq数数组。像这样:[1,2,3,4,7,8,10,12]。它可以是未分类的。 我需要的是获取此阵列的整数:Ruby任务:将数字连接到间隔,ruby,Ruby,我有一个uniq数数组。像这样:[1,2,3,4,7,8,10,12]。它可以是未分类的。 我需要的是获取此阵列的整数: intervals_for [1,2,3,4,7,8,10,12] #=> "1-4, 7-8, 10,12" 我有自己的解决方案: def intervals_for(array) array.sort! new_array = [] array.each do |a| if new_array.last and a == new_array.l
intervals_for [1,2,3,4,7,8,10,12]
#=> "1-4, 7-8, 10,12"
我有自己的解决方案:
def intervals_for(array)
array.sort!
new_array = []
array.each do |a|
if new_array.last and a == new_array.last.last+1
new_array.last << a
else
new_array << [a]
end
end
new_array.map{|a| a.size > 1 ? "#{a.first}-#{a.last}" : a.first}.join(", ")
end
def interval_(阵列)
数组,排序!
新的_数组=[]
array.each do | a|
如果new_array.last和a==new_array.last.last+1
新的_array.last这是我的,使用1.9.1版
def torange(a)
r=[];s=a[0]
a.uniq.sort!.each_cons(2) do |a|
r<<[s,a[0]] and s=a[1] if a[1]-a[0]!=1
end
left=a.index(s)
r<<[a[left..-1][0],a[left..-1][-1]]
end
torange([1,2,3,4,7,8,10,12]).each do |x|
puts x[0]==x[1] ? "#{x[0]}" : "#{x[0]}-#{x[1]}"
end
这一个是递归的,感觉可能会更好
arr = [1,2,3,4,7,8,10,12]
def intervals(arr)
return arr if arr.size == 0 || arr.size == 1
int = [arr.shift]
while int.last + 1 == arr.first
int << arr.shift
end
( int.size == 1 ? int : ["#{int.first}-#{int.last}"] ) + intervals(arr)
end
p intervals(arr)
arr=[1,2,3,4,7,8,10,12]
def间隔(arr)
如果arr.size==0 | | arr.size==1,则返回arr
int=[arr.shift]
而int.last+1==arr.first
int这是我的一行:
array = [-10, -9, -1, 0, 1, 2, 3, 4, 10, 11, 15, 133]
array.uniq.sort.inject([]){ |a, e| a[-1] && a[-1].last && a[-1].last == e-1 ? a[-1] = (a[-1].first..e) : a << (e..e); a }
#=> [-10..-9, -1..4, 10..11, 15..15, 133..133]
array=[-10,-9,-1,0,1,2,3,4,10,11,15,133]
array.uniq.sort.injection([]){a,e | a[-1]&&a[-1]。last&&a[-1]。last==e-1?a[-1]=(a[-1]。first..e):a[-10..-9,-1..4,10..11,15..15,133..133]
还有小猴子
class Array
def.collect_to_ranges
self.uniq.sort.inject([]){ |a, e| a[-1] && a[-1].last && a[-1].last == e-1 ? a[-1] = (a[-1].first..e) : a << (e..e); a }
end
end
array = [1,2,3,4,5,6,7,8, 10]
array.collect_to_ranges
#=> [1..8, 10..10]
类数组
def.collect_至_范围
self.uniq.sort.injection([]){a,e | a[-1]&&a[-1]。last&&a[-1]。last==e-1?a[-1]=(a[-1]。first..e):a[1..8,10..10]
我需要它来连接年份。我有很多年份,我想用这种方式压缩它们。比如:Pedro Yanoviches(1985-1994,1999-2010)
可能与非常接近的主题重复,但有点不同。无论如何,这也很有帮助。谢谢。这个解决方案很好,输出没有我需要的那么人性化。我们需要更多的步骤来实现这一点:“1-4,7-8,10,12”
Thanx foreach_cons
method:)这对我来说是新的,输出取决于您根据自己的意愿进行格式化。请参阅我的编辑。@fl00r:torange([1,2,3,4,7,8,10,12])。map{x | x[0]==x[1]?x[0]:x.join('-')}.join('-')join(','))
class Array
def.collect_to_ranges
self.uniq.sort.inject([]){ |a, e| a[-1] && a[-1].last && a[-1].last == e-1 ? a[-1] = (a[-1].first..e) : a << (e..e); a }
end
end
array = [1,2,3,4,5,6,7,8, 10]
array.collect_to_ranges
#=> [1..8, 10..10]