在这种情况下,为什么Java代码输出10而不是-1?如何解决这个问题?

fnatzsnv  于 2022-12-28  发布在  Java
关注(0)|答案(2)|浏览(130)

我正在创建一个静态方法“indexOfKeyword”,当字符串没有嵌入到另一个单词中时,它将返回一个indexOf字符串-当没有嵌入时,它将返回-1。
给定

String s = "She sells seashells by the seashore.";
String keyword = "sea";

输出意味着是-1,因为关键字“sea”被嵌入到每个词中;然而,我的代码输出10,即在“seashells”中第一次找到“sea”的位置。
如果字符串在开头单独出现,例如

String s = "Carolyn has a car that is scary fast.";
String keyword = "car";

我做了一个startIdx必须大于0的例子,这样“Carolyn”中的“Car”就不会被选中。当上面的代码被输入到下面的代码中时,它会按预期工作,正确地输出14。
下面是应该输出-1的完整代码:

public class Chatter {
    public static int indexOfKeyword(String s, String keyword) {
        s = s.toLowerCase();
        keyword = keyword.toLowerCase();
        int startIdx = s.indexOf(keyword);
        while (startIdx >= 0) {
            String before = " ", after = " ";
            if (startIdx > 0) {
                before = s.substring(startIdx - 1, startIdx);
            }
            int endIdx = startIdx;
            if (endIdx < s.length()) {
                after = s.substring((startIdx + keyword.length()), (startIdx + keyword.length() + 1));
            }
            if (!(before.compareTo("a") >= 0 && before.compareTo("z") <= 0 && after.compareTo("a") >= 0
                    && after.compareTo("z") <= 0)) {
                if (startIdx > 0) {
                    return startIdx;
                }
            }
            startIdx = s.indexOf(keyword, s.indexOf(keyword) + 1);
        }
        return -1;
    }

    public static void main(String[] args) {
        // ... and test it here
        String s = "She sells seashells by the seashore.";
        String keyword = "sea";
        System.out.println(indexOfKeyword(s, keyword));
    }
}
x6492ojm

x6492ojm1#

对不起,也许我误解了你的意思,但是你有没有考虑过在搜索之前用空格把你的键盘括起来?
这样的事情(理论上)应该行得通:

public static int indexOfKeyword(String s, String keyword) {
    String source = s.toLowerCase();
    String key = " " + keyword.toLowerCase() + " ";
    return source.indexOf(key);
}

或者(正如@Tom所指出的)可以使用RegEx,但是这个解决方案更复杂,可能不像您希望的那样明显。
在您的情况下,它可能如下所示:

public static int indexOfKeyword(String s, String keyword) {
    Matcher m = Pattern.compile("\\s" + keyword + "\\s", Pattern.CASE_INSENSITIVE).matcher(s);
    return m.find() ? m.start() : -1;
}
hkmswyz6

hkmswyz62#

我理解您想要查找特定的单词而不是特定的子字符串。
您的方法indexOfKeyword中有两个错误。

  1. while循环中的条件是错误的。您需要将其拆分为两个单独的条件。
    1.设置startIdx以搜索下一个keyword也是错误的。
    将您的代码与下面的代码进行比较。
public static int indexOfKeyword(String s, String keyword) {
    int startIdx = s.indexOf(keyword);
    while (startIdx >= 0) {
        String before = " ", after = " ";
        if (startIdx > 0) {
            before = s.substring(startIdx - 1, startIdx);
        }
        int endIdx = startIdx;
        if (endIdx < s.length()) {
            after = s.substring((startIdx + keyword.length()), (startIdx + keyword.length() + 1));
        }
        if (!(before.compareTo("a") >= 0 && before.compareTo("z") <= 0)) {
            if (!(after.compareTo("a") >= 0 && after.compareTo("z") <= 0)) {
                if (startIdx > 0) {
                    return startIdx;
                }
            }
        }
        startIdx = s.indexOf(keyword, startIdx + 1);
    }
    return -1;
}

正如@Tom在他的评论中提到的,还有其他的方法来解决这个问题。我假设你的目的是提出并实现你自己的算法,因此我已经向你展示了你在实现中的错误之处。
注意,单个空格不是分隔句子中单词的唯一方式,例如,句子中的两个单词可以用逗号分隔。

相关问题