检查字母1后面是否跟着数字2和数字2后跟数字3

时间:2017-11-01 13:40:45

标签: java string

我想编写一个返回true的函数,如果当且仅当 字符串a后面跟着字符串b,字符串b后面跟着字符串c,这是我写的,但它不起作用:

public static boolean follows2(String s, String a, String b, String c) {
    boolean res = true;
    for (int i = 0; i < s.length(); i++) {
        if (charAtPos(s, i).equals(a)) {

            if (!(charAtPos(s, i + 1).equals(b))) {
                res = false;
                if (!(charAtPos(s, i + 2).equals(c))) {
                    res = false;
                }
            }
        }
    }
    return res;
}

public static void main(String[] args) {

    System.out.println(follows2(" koali oliali ", "a", "l", "i"));
    // RETURN TRUE OK since for each " a" is followed by "l" then "i"
    System.out.println(follows2("ipoipa", "i", "p", "a"));
    //RETURN TRUE BUT IT'S NOT !
    // The first " i" is followed by " p" then "o" which is not good 
}

这是我写的函数: 字符串a后面跟着字符串b(它可以工作)

public static boolean follows(String s, String a, String b) {
    boolean res = true;
    for (int i = 0; i < s.length(); i++) {
        if (charAtPos(s, i).equals(a)) {

            if (!(charAtPos(s, i + 1).equals(b))) {
                res = false;
            }
        }
    }
    return res;
}

public static String charAtPos(String s, int i) {
    return String.valueOf(s.charAt(i));
}

public static void main(String[] args) {
    System.out.println(follows("Arnold Barney", "r", "n"));
    // RETURN TRUE because each "r" are followed by the letter "n"
    System.out.println(follows("Arnold Barney", "n", "o"));
    // RETURN FALSE , because not every "n" is followed by "o"
}

在我的第一个程序中可以做些什么来使它工作? 谢谢

5 个答案:

答案 0 :(得分:1)

使用递归:

public static boolean follows(String s, String a, String b, String c) {
    int ai = s.indexOf(a);
    if (ai == -1) {
        return true; // No more 'a' string, we're all good
    }
    int bi = s.indexOf(a + b);
    int ci = s.indexOf(a + b + c);
    if (bi != ai || ci != ai) {
        return false; // Strings 'b' and 'bc' don't follow 'a', so the check failed
    }
    return follows(s.substring(ai + a.length()), a, b, c);
}

实际上,bi可以删除。

答案 1 :(得分:0)

这是一个更清晰的答案(测试和工作很好):

public static boolean follows(String s, String...strings) {
    int number = 0;
    for(int i = 0; i<s.length(); i++){
        if(strings[number].length()+i<s.length() && s.substring(i, strings[number].length()+i).equals(strings[number]) && number+1 != strings.length) number++;
        else if(number!=0 && !s.substring(i, strings[number].length()+i).equals(strings[number])) return false;
        else number = 0;
    }
    return true;
}

它修复了代码中的许多问题:

  • 使用字符串但使用&#34; charAt&#34;
  • 复制该功能只是为了添加参数

答案 2 :(得分:0)

因为代码没有按照您的想法执行。

如果你要在代码中添加一些打印件,你会发现你从未将“res”设置为false。

让我们调试您正在测试的案例:

  • 当遇到第一个字母 - “i”时 - 它进入了第一个if。
  • 下一个字母是“p”,所以如果你没有输入第二个字母,那么你将继续使用“for”中的下一个字母。

答案 3 :(得分:0)

这是我的尝试(没有经过测试)

boolean hasOnlyCompleteSequences(String source, char.. chars) {
    for (int s = 0; s < source.length(); s++) {
       int c = 0;
       if (source.charAt(s) == chars[c]) {
           if (!isCompleteSequence(source, s + 1, chars, c + 1)) {
               return false;
           }
       }          
    }
    return true;
}

boolean isCompleteSequence(String source, int s, char[] chars, int c) {
    while (s < source.length() && c < chars.length) {
        // note: the indices get increased AFTER comparison
        if (source.charAt(s++) != chars[c++]) {
            return false;
        }            
    }
    // cover the case that the source String ends with an incomplete sequence
    if (s == source.length() && c < chars.length) {
        return false;
    }
    return true;
}    

答案 4 :(得分:0)

您遇到的问题是,由于您的逻辑存在轻微缺陷,您实际上并没有输入嵌套的if语句。

我会将其更改为检查是否i + 1 is equal to String b || i + 2 is equal to String c

public static boolean follows2(String s, String a, String b, String c) {
        boolean res = true;
        for (int i = 0; i < s.length(); i++) {
            if (charAtPos(s, i).equals(a)) {
                if (!(charAtPos(s, i + 1).equals(b)) || !(charAtPos(s, i + 2).equals(c))) {
                    res = false;
                }
            }
        }
        return res;
    }