Как создать мой собственный простой метод indexOf()

#java #for-loop #indexof

#ява #для цикла #индекс #java #indexof

Вопрос:

Я пытаюсь создать простой indexOf() метод, который возвращает значение int и который распознает строку (не char) строкового массива.

 public int indexOf(String str) {

    /*Getting and return the index of the first 
     *occurrence of the specified String. Return 
     *-1 if string not in the list
     */

    for(int i = 0; i < listArray.length; i  ) {
        if(listArray[i].equals(str)) {
            return str.indexOf(listArray[i]);
        }
    }
    return -1;
}
  

Я использую indexOf() метод из Java для первого возврата, но он всегда возвращает 0. Почему это так, и есть ли лучший способ написать этот метод?

Комментарии:

1. Если вы пытаетесь реализовать свою собственную indexOf функцию (я полагаю, для практики), не приведет ли использование встроенной функции к поражению цели упражнения? Может быть, вам следует подумать о том, что на самом деле делает функция (или взглянуть на реализацию в вашем JDK) и взять ее оттуда.

2. Не рассматривая другие проблемы в вашем коде, лучше просто вернуть i, как только вы усердно поработаете и повторите весь путь до него …:)

3. Что, черт возьми, такое listArray ?

4. Также для хорошего чтения, посмотрите, что equals из себя представляет, быстро взглянув на стандартную реализацию алгоритма Кнута-Морриса-Пратта topcoder.com/community/data-science/data-science-tutorials /…

5. Метод indexOf всегда возвращает индекс первого вхождения строки. И теперь мне интересно, почему это работает только с возвращаемым значением i? Почему он не возвращает ту же строку, что и другие индексы? Например, слово ‘hello’ сначала появляется в индексе 1, затем оно появляется в индексе 3; и метод вернет индекс 1.

Ответ №1:

Ваш цикл for в порядке, проблема в том, что когда вы его находите, вы возвращаете индекс, в котором строка находится сама по себе, и это всегда будет 0.

Например, «hello» находится в позиции 0 для строки «hello».

Вы должны просто вернуть i , вот так:

 public int indexOf(String str) {

    /* Getting and return the index of the first 
     * occurrence of the specified String. Return 
     * -1 if string not in the list
     */

    for (int i = 0; i < listArray.length; i  ) {
        if (listArray[i].equals(str)) {
            // If we get here, it means that the item for position `i` is equal to `str`.
            return i; // just return `i` 
        }
    }

    return -1;
}
  

Ответ №2:

return i; по определению listArray[i] равно str .

Ответ №3:

Потому что всякий раз, когда вы запускаете return str.indexoOf(listArray[i]); , у вас уже есть str equals listArray[i] . Конечно, вы получаете 0 все время, это эквивалентно str.indexOf(str);

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

 return i;
  

Ответ №4:

Вы должны вернуть i (индекс), когда выполняется условие if.

 public int indexOf(String str) {

    for(int i = 0; i < listArray.length; i  ) {
        if(listArray[i].equals(str)) {
            return i;
        }
    }
    return -1;
}
  

Ответ №5:

Я думаю, вы запутались. если вы хотите найти строку из ArrayList и если вы уже нашли строку в своем if(listArray[i].equals(str)) , то все, что вам нужно сделать, это просто вернуть этот индекс i, поскольку вы его уже нашли.

 for(int i=0;i<listArray.length;i  ){
        if(listArray[i].equals(str)){
            return i;
        }
    }
  

это ответ.

Всегда помните: Если вы даже опубликуете содержимое или образец вашего listArray и образец строки для поиска в нем… Это поможет нам лучше понять, где именно вы застряли

Ответ №6:

Вы можете сделать это с помощью цикла for.

  1. Проверьте, совпадает ли строка с использованием equals.
  2. Если да, верните индекс.
  3. Если вы выйдете из цикла for, верните значение -1.

Ответ №7:

 public int indexOf(String iparam){
    String astring = "" //YOUR OWN STRING
    boolean astat = false;
    List<Integer> alist = null;

    for(int i=0; i<astring.toCharArray().length; i  ){
        alist = new ArrayList<>();
        for(int j=0; j<iparam.toCharArray().length; j  ){
            try{
                if(astring.toCharArray()[i j] == iparam.toCharArray()[j]){
                    alist.add(i j);
                }else{
                    break;
                }
            }catch(Exception ex){
                ex.printStackTrace();
                break;
            }
        }
        if(alist.size() == iparam.toCharArray().length){
            astat = true;
            break;
        }
    }

    if(astat){
        return alist.get(0);
    }else{
        return -1;
    }
}