4 votes

Découper des données discontinues en parties continues en Ruby

J'ai cet array discontinue :

a = [1, 2, 3, 7, 8, 10, 11, 12]

J'ai besoin qu'il soit un array d'arrays continus :

[[1, 2, 3], [7, 8], [10, 11, 12]]

Je parcours l'original, comparant chaque valeur à la dernière pour construire de nouveaux arrays :

parts = []
last = nil
a.each do |n|
  parts.push [] if last.nil? || last+1 != n
  parts.last.push n
  last = n
end

Cela semble sale et non digne de Ruby. Je suis intéressé par trouver une solution propre et élégante.

0voto

Edgars Jekabsons Points 2323

Alternative, pas aussi bon que celui proposé, mais plus proche du vôtre et un peu plus lisible

a = [1, 2, 3, 7, 8, 10, 11, 12]

a.each_with_object({ last: nil, result: [] }) do | n, memo|
  memo[:result] << [] unless memo[:last] && memo[:last] + 1 == n
  memo[:result].last << n
  memo[:last] = n
end[:result]

0voto

rthbound Points 713

Question amusante, tybro0103... voici ce que j'ai trouvé

tarr = [1, 2, 3, 7, 8, 10, 11, 12]
out  = []

tarr.count.times do
  i = 0 unless tarr[0].nil? && break

  while tarr[0..i] == (0..i).map {|x| tarr[0] + x }
    i+=1
  end

  out << tarr.shift(i)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X