Почему я не могу получить indexOf () равным ничему, кроме 0 в этом коде? - PullRequest
0 голосов
/ 14 ноября 2018

Моя главная цель - получить значение -1 для indexOf каждый раз, когда буква не найдена в слове, в котором выполняется поиск. Я могу использовать это значение, чтобы определить, являются ли слова anagramsили нет.Проблема, однако, в том, что я постоянно получаю 0 за indexOf.Разве я не получаю -1, если буквы совершенно разные?

import java.lang.*;
import java.io.*;
import java.util.*;


public class anagram
{


    public static void main(String args[])
    {

        Scanner kbReader = new Scanner(System.in);
        System.out.println("Enter first word");
        String a = kbReader.next();
        System.out.println("Enter second word");
        String b = kbReader.next(); ///User inputs 2 strings, a and b
        a = a.toLowerCase();
        b = b.toLowerCase();

        int numA = a.length();
        int numB = b.length();

        if (numA != numB)
           System.out.println("NOT AN ANAGRAM"); 



        for(int i = 0;i < numA; i++) ///continues until all letters are used
        {
            String letter = b.substring(i,i++);
            int checker = a.indexOf(letter);///checks word a for every letter of b

            System.out.println(checker); ///always get 0 for this value, why never -1?



       }
   }


}

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Отвечая на вопрос, почему вы не можете получить ничего, кроме 0, от indexOf ():

В этом утверждении String letter = b.substring(i,i++); Допустим, вы находитесь на второй итерации (т.е. i = 2) в цикле for. Вы использовали оператор постинкремента, это означает, что сначала выполняется оператор, а затем значение увеличивается.

В этом случае b.substring(i,i++); разрешается до b.substring(2,2); и вы получите String letter = ""

В соответствии с реализацией indexOf (), индекс "" в любой строке возвращается как 0, и именно здесь цель вашей логики побеждена.

Просто для понимания цели я вставлю реализацию indexOf () из класса String.java:

/**
 * Code shared by String and StringBuffer to do searches. The
 * source is the character array being searched, and the target
 * is the string being searched for.
 *
 * @param   source       the characters being searched.
 * @param   sourceOffset offset of the source string.
 * @param   sourceCount  count of the source string.
 * @param   target       the characters being searched for.
 * @param   targetOffset offset of the target string.
 * @param   targetCount  count of the target string.
 * @param   fromIndex    the index to begin searching from.
 */
static int indexOf(char[] source, int sourceOffset, int sourceCount,
        char[] target, int targetOffset, int targetCount,
        int fromIndex) {
    if (fromIndex >= sourceCount) {
        return (targetCount == 0 ? sourceCount : -1);
    }
    if (fromIndex < 0) {
        fromIndex = 0;
    }
    if (targetCount == 0) {
        return fromIndex;
    }

    char first = target[targetOffset];
    int max = sourceOffset + (sourceCount - targetCount);

    for (int i = sourceOffset + fromIndex; i <= max; i++) {
        /* Look for first character. */
        if (source[i] != first) {
            while (++i <= max && source[i] != first);
        }

        /* Found first character, now look at the rest of v2 */
        if (i <= max) {
            int j = i + 1;
            int end = j + targetCount - 1;
            for (int k = targetOffset + 1; j < end && source[j]
                    == target[k]; j++, k++);

            if (j == end) {
                /* Found whole string. */
                return i - sourceOffset;
            }
        }
    }
    return -1;
}

Здесь targetCount равен 0, и в вашем коде возвращается значение 0.

0 голосов
/ 14 ноября 2018

изменить на

String letter = b.substring(i,i + 1);

См. Также Оператор пост-инкремента java

Кстати, строки одинакового размера не означает, что они анаграммы

...