Возвратите индекс всех случаев символа в строке в рубине

Другая опция состоит в том, чтобы использовать словарь со значениями, о которых Вы не заботитесь. Например,


poor_man_set = {}
poor_man_set[1] = None
poor_man_set[2] = None
poor_man_set[3] = None
...

можно рассматривать ключи как набор за исключением того, что они - просто массив:


keys = poor_man_set.keys()
print "Some key = %s" % keys[0]

побочный эффект А этого выбора состоит в том, что Ваш код будет назад совместим с более старым, пред - set версии Python. Это - возможно, не лучший ответ, но это - другая опция.

Редактирование: можно даже сделать что-то вроде этого для сокрытия того, что Вы использовали dict вместо массива или установили:


poor_man_set = {}
poor_man_set[1] = None
poor_man_set[2] = None
poor_man_set[3] = None
poor_man_set = poor_man_set.keys()
22
задан Cœur 2 May 2017 в 17:06
поделиться

5 ответов

s = "a#asg#sdfg#d##"
a = (0 ... s.length).find_all { |i| s[i,1] == '#' }
22
ответ дан 29 November 2019 в 04:06
поделиться
require 'enumerator' # Needed in 1.8.6 only
"1#3#a#".enum_for(:scan,/#/).map { Regexp.last_match.begin(0) }
#=> [1, 3, 5]

ETA: Это работает путем создания перечислителя, который использует сканирование (/ # /) в качестве каждого метода.

сканирование дает каждое вхождение указанного шаблона (в в данном случае / # / ) и внутри блока вы можете вызвать Regexp.last_match для доступа к объекту MatchData для совпадения.

MatchData # begin (0) возвращает индекс, с которого начинается совпадение, и, поскольку мы использовали карту в перечислителе, мы получаем обратно массив этих индексов.

15
ответ дан 29 November 2019 в 04:06
поделиться

Вот менее изощренный способ:

i = -1
all = []
while i = x.index('#',i+1)
  all << i
end
all

В быстром тесте скорости это было примерно в 3,3 раза быстрее, чем метод find_all FM, и примерно в 2,5 раза быстрее, чем метод enum_for sepp2k.

13
ответ дан 29 November 2019 в 04:06
поделиться

Вот длинная цепочка методов:

"a#asg#sdfg#d##".
  each_char.
  each_with_index.
  inject([]) do |indices, (char, idx)|
    indices << idx if char == "#"
    indices
  end

# => [1, 5, 10, 12, 13]

требует 1.8.7+

2
ответ дан 29 November 2019 в 04:06
поделиться

Другое решение, полученное из ответа FMc:

s = "a#asg#sdfg#d##"
q = []
s.length.times {|i| q << i if s[i,1] == '#'}

Мне нравится, что у Ruby никогда не бывает только одного способа сделать что-то!

1
ответ дан 29 November 2019 в 04:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: