J'ai un tableau de nombres UNIQ. Comme ceci: [1,2,3,4,7,8,10,12]. Cela peut être non traduit. Ce dont j'ai besoin, c'est d'obtenir des INTEvals pour ce tableau:
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
3 Réponses :
Voici le mien, à l'aide de Ver 1.9.1 sortie p>
La sortie n'est pas si humaine que nécessaire. Nous avons besoin d'une étape de plus pour obtenir cela ici: "1-4, 7-8, 10, 12" code>
Merci pour chaque_cons code> méthode :) c'est nouveau pour moi
Eh bien, la sortie est à vous de le formater en fonction de votre souhait. Voir mon édition.
@ FL00R: Torange ([1,2,3,4,7,8,10,12]). Carte {| x | x [0] == x [1]? x [0]: x.join ('-')} .join (',')
Celui-ci est récursif, on se sent comme si cela pourrait être mieux cependant ...
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)
Voici mon one-liner:
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]
J'en ai besoin pour rejoindre des années ensemble. J'ai du nombre d'années et je veux les compacter de cette façon. Comme:
Pedro Yanoviches (1985-1994, 1999-2010) Code>Dupliqué possible de Array d'index à la matrice de gammes
Thème très proche mais un peu différent. En tout cas, c'est utile aussi. Merci
Cette solution est excellente Stackoverflow.com/questions/3728660/...