2013-10-04 3 views
1

Я работаю над домашним заданием. Вот моя проблема и попытка решения.Как показать местоположение каждой оккурации символа в строке?

Показать расположение каждого совпадения символа "е" в строке "tx_val"

tx_val="the quick brown fox jumped over the lazy dogs back"; 

    os=' '; //output string 
    eloc=' '; 

    for (i=0; i<tx_val.lastIndexOf('e');i++) 
    { 
    if(tx_val.indexOf('e')!= -1) 
     { 

      eloc=tx_val.indexOf('e') ; 
      os=os+eloc; 
      i++; 
     } 

     }   

Мои Ожидаемые результаты: 2 24 29 34

Мои результаты: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Я не ищу ответа так же, как кому-то, чтобы объяснить, почему моя логика не работает, и указать мне на правильную направление.

+5

Используйте второй аргумент IndexOf. –

+2

'indexOf ('e')' будет * всегда * дает вам * первый * индекс 'e'. Используйте [второй аргумент] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf), чтобы указать, с чего начать поиск. Сказав это, я бы не решил эту проблему, как вы это делаете. –

+2

Почему вы увеличиваете 'i' внутри цикла? – j08691

ответ

2

Лучшее решение может быть что-то вроде этого:

var lastIndex = tx_val.indexOf('e'); 
while (lastIndex > -1) { 
    os += lastIndex + " "; 
    lastIndex = tx_val.indexOf('e',lastIndex + 1); 
} 
+0

Побей меня. :) – talemyn

+0

Это работает отлично. Если ты не возражаешь, я спрашиваю. Как вы определили использование цикла while? Это то, чему вы научились после многолетнего опыта? –

+0

Технически любой цикл 'for' можно переписать как цикл while и наоборот. Цикл 'while' просто чувствует себя более естественным для того, что мы пытаемся сделать здесь, так как вы хотите зацикливать *, пока какое-то условие по-прежнему истинно (есть еще« e »для соответствия). Вы могли бы написать некоторые как 'for (var lastIndex = tx_val.IndexOf ('е'); lastIndex> -1; lastIndex = tx.val.indexOf ('e', lastIndex + 1)) 'и он должен работать одинаково. Но мне лично не нравятся циклы 'for', которые делают больше, чем простое сложение или вычитание для каждого цикла. YMMV. –

4

При вызове с одним аргументом в той же строке indexOf() будет продолжать возвращать один и тот же индекс каждый раз.

Первый аргумент indexOf() - подстрока, подлежащая согласованию. Второй необязательный аргумент - это индекс для начала формы поиска. Если вы не передадите этот аргумент, результат не изменится между каждой итерацией.

Также неверно предполагать, что цикл должен иметь итератор i, равный значению lastIndexOf(). Это заставило бы цикл запускать много избыточных итераций, так как количество совпадений, конечно же, не равно значению совпадающих индексов (если только строка не состоит из e символов). Другими словами, если бы у вас было только одно совпадение в индексе 24, цикл все равно повторялся бы 23 раза без причины.

+0

Спасибо за ваш ответ/комментарий. Я пересмотрел свой код и получил 2-й, 3-й 4-й и т. Д. Аргумент indexOf(). Ваша точка о повторяющихся циклах повторяется. Как я могу определить, как определить второй аргумент цикла for for, чтобы запрограммировать только необходимое количество раз? –

+0

Нет проблем. @MattBurland действительно является правильным решением в этом случае. – Boaz

0

Что делать, если вы пытаетесь разделить вашу строку в массив отдельных людей символов, разобрать его и хранить совпадающие индексы в другой (выход) массив?

1

Другие уже предоставили решение (второй параметр indexOf).

Я просто оставить эту строку здесь

tx_val.replace(/e/g, function(str, i) {os = os + ' ' + i}); 
Смежные вопросы