Итерация по массиву символов в шагах - PullRequest
3 голосов
/ 03 февраля 2012

У меня есть массив шестнадцатеричных символов, который> 8000 символов, и мне нужно выполнить некоторые операции с каждыми 6 символами в массиве.

Диапазоны в рубине имеют действительно классную функцию шага:

(1..100).step(6) do //etc....

Есть ли какая-либо функциональность, аналогичная этой для массивов?

Что-то вроде:

string.split("").step(6) do //etc...

Ответы [ 4 ]

4 голосов
/ 03 февраля 2012

Вы хотите Enumerable#each_slice:

require 'enumerator' # if pre-Ruby1.9
string.split("").each_slice(6) do |ary|
  # ary is a 6-length array, and this is executed for every block of 6 characters
end
2 голосов
/ 03 февраля 2012

Вы говорите, что у вас есть массив символов, но затем вы показываете код, используя string.split("").

Более эффективно, чем использование split("") - которое создаст промежуточный массив из 8 000 строк перед началом, тратя время и память - используйте перечислитель String#chars вместе с each_slice

string.chars.each_slice(6) do |a,b,c,d,e,f|
  # one variable for each character
end

или

string.chars.each_slice(6) do |a|
  # a is an array of all six
end

(Также обратите внимание each_cons(6), на случай, если вы действительно это имели в виду.)

1 голос
/ 03 февраля 2012

Использование Array.each_slice(6):

%w[a b c d e f g h i j k l m n o p].each_slice(6) { |s| puts s.join(',') }
a,b,c,d,e,f
g,h,i,j,k,l
m,n,o,p
0 голосов
/ 16 августа 2017

Вы можете просто использовать диапазон с шагом, и метод Array values_at.Этот метод принимает одно или несколько целых чисел или диапазон в качестве аргумента индексов.К сожалению, метод Range step возвращает не диапазон, а перечислимый.Однако это может быть просто преобразовано в массив целых чисел с префиксом *.

string = "You could just use a range with step, and Array's method values_at."
step6 = (0...string.length).step(6)

string.split("").values_at(*step6).each do |char|
  puts char
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...