Разрешить indexOf проверять совпадение несколько раз в Java - PullRequest
0 голосов
/ 14 июля 2011

В настоящее время я работаю над проектом для класса, чтобы создать класс TextLine, представляющий строку текста, которая должна быть представлена ​​в виде массива символов. Мне не разрешено представлять объект TextLine, используя класс строки косвенно или напрямую, однако я могу использовать его для работы с параметрами.

Для одного из методов я должен принять строку в качестве аргумента параметра, который также является фрагментом объекта TextLine, а затем вернуть позицию индекса первого вхождения фрагмента в этой TextLine. или -1, если фрагмент не найден.

Сейчас я пытаюсь выяснить метод indexOf, но моя проблема в том, что мой метод проверяет только начальную точку один раз. Поэтому, если буква объекта TextLine не совпадает с буквой фрагмента в первый раз, но есть другое совпадение где-то еще в объекте, метод не проверяет эту начальную точку.

Например, допустим, я ввожу игру с пером в качестве TextLine, а затем я играю в качестве фрагмента. Ясно, что в TextLine происходит воспроизведение, но мой метод indexOf выполняет то, что он проверяет первый p из penplay с индексом 0, а затем продолжает видеть, соответствуют ли следующие буквы длительности воспроизведения, и если он нет, он возвращает -1. Любая идея, как я мог позволить алгоритму продолжать искать другую отправную точку?

Вот что у меня есть для моего кода:

public int indexOf(String fragment){

char[] temp = fragment.toCharArray();

int j = 0;
for(int i = 0; i < someText.length; i++){
    while(someText[i] == temp[j]){

        for(j = 1; j < temp.length; j++){
            if(temp[j] != someText[i+j]){
                return -1;
            }
        }

        return i;

    }
}

return -1;

}

Ответы [ 3 ]

4 голосов
/ 14 июля 2011

Вы используете специальный символ для первого символа, когда в этом нет необходимости. В основном вам нужно сказать:

  • Для каждого потенциального начального персонажа ...
    • Совпадает ли целое число fragment, начиная с этой позиции кандидата?

Так что-то вроде:

// Only deal with *viable* starting points
for (int i = 0; i < someText.length - temp.length; i++) {
    boolean found = true;
    for (int j = 0; j < temp.length && found; j++) {
        if (temp[j] != someText[i + j]) {
            found = false;
        }
    }
    if (found) {
        return i;
    }
}
return -1;

Это можно изменить, извлекая внутренний цикл:

for (int i = 0; i < someText.length - temp.length; i++) {
    if (textMatches(temp, i)) {
        return i;
    }
}
return -1;

...
// TODO: Javadoc to explain parameters :)
private boolean textMatches(char[] chars, int startingIndex) {
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] != someText[i + startingIndex]) {
            return false;
        }
    }
    return true;
}
1 голос
/ 14 июля 2011

То, как вы его настроили, кажется подходящим для функции doesStringExistAtIndex(j, fragment).Поскольку это возвращает -1, если строка не существует в первом индексе, вы можете сделать что-то вроде этого:

//assuming that "this" is the subject that you are searching in
public int indexOf(String fragment){
  for(int i=0; i<this.length; ++i){
    if(doesStringExistAtIndex(i, fragment))
      return i;
  }
  return -1;
}
0 голосов
/ 14 июля 2011

Не уверен, что это то, что вы хотели, но я в основном написал метод indexOf. Я провел некоторое тестирование, и в некоторых тестах, которые я проводил, это работало нормально. Конечно, все будет выглядеть по-другому, потому что я хотел сделать тестирование проще, но если вы решите его использовать, это займет не более 30 секунд.

public int indexOf(String fragment, String source)
{
    char[] temp = fragment.toCharArray();
    char[] someText = source.toCharArray();

    outer : for(int i = 0; i <= someText.length - temp.length;i++) //stops looping because why loop after the fragment is longer than the source we have left when its impossible to find
    {
        if(someText[i] == temp[0]) //if the first characters are the same
        {
            int q = 0;
            while(q < temp.length) //loop through the fragment
            {
                if(someText[i+q] != temp[q]) //if the characters are not the same, stop, and go to the next character of the source. Don't return anything
                {
                    continue outer; //continues the loop labeled 'outer' (e.g. outer : for(...) )
                }
                q++; //increment index since they both match
            }
            return i; //fragment and some part of the source matched since it reached here. Return the index of the first character
        }
    }
    return -1; //reached here because nothing was found :( return -1
}

РЕДАКТИРОВАТЬ 0 Добавлены комментарии к строке

...