如何跳出if语句java,跳过Java if语句

2023-05-16

The method below takes in a string and a pattern and returns true if they match each other. A '.' matches 1 char and a '*' matches 0 or more (e.g. expMatch("abc", "a.c") should return true). I added a bunch of print statements to see where I went wrong and it seems like the if statement is being skipped even if the str.length() == 1.

I call it with System.out.println(expMatch("abc", "a*c"));

Here is the code:

public static boolean expMatch(String str, String pat)

{

if (str.charAt(0) == pat.charAt(0) || pat.charAt(0) == '.')

{

System.out.println("in if");

System.out.println(str.charAt(0));

System.out.println(pat.charAt(0));

System.out.println(str.length());

if (str.length() == 1)

return true;

expMatch(str.substring(1), pat.substring(1));

}

else if (pat.charAt(0) == '*')

{

System.out.println("in else");

System.out.println(str.charAt(0));

System.out.println(pat.charAt(0));

if (str.length() == 1)

return true;

if (str.charAt(0) == pat.charAt(1)) //val of * = 0

expMatch(str, pat.substring(1));

else if (str.charAt(1) ==pat.charAt(1))

expMatch(str.substring(1), pat.substring(1));

}

return false;

}

and the output is:

in if

a

a

3

in else

b

*

in if

c

c

1

false

Even if the length is 1 it skips the if? Any idea why?

P.S. I'm not looking for the solution, just why the if statement is being skipped.

解决方案

Your approach is logically incorrect even if you apply the fixes the others suggested. Try this test case:

System.out.println(expMatch("abddddc", "a*c"));

This is because when you encounter a * in the pattern, you have no way to know how many characters "to eat" from the search string.

To say the least, you need a loop somewhere, not just an if. Let me try to fix it for you (not sure if it's possible though, not sure if you always know which path to take, I mean in your recursion). Think some more about it. Here is another unpleasant test case:

System.out.println(expMatch("adddcac", "a*c"));

// the * needs to eat dddca (despite the c present in dddca),

// it should not stop recursing there at that c

I think you need some sort of full search here.

Just an if or a while loop is not good enough.

EDIT: Here is a fixed version with a bunch of nasty tests. I think this is called non-linear recursion (as it's not a single path you try). Not 100% sure though about that term.

public class Test055 {

public static void main(String[] args) {

// System.out.println(expMatch("abddddc", "a*c"));

System.out.println(expMatch("adcax", "a*c"));

System.out.println(expMatch("adcax", "a*c*"));

System.out.println(expMatch("adcacm", "*"));

System.out.println(expMatch("adcacmmm", "a*c"));

System.out.println(expMatch("adcacmmmc", "a*c"));

System.out.println(expMatch("adcac", "a*c"));

System.out.println(expMatch("adcacxb", "a*c.b"));

System.out.println(expMatch("adcacyyb", "a*c.b"));

System.out.println(expMatch("adcacyyb", "a*c*b"));

}

public static boolean expMatch(String str, String pat)

{

// System.out.println("=====================");

// System.out.println("str=" + str);

// System.out.println("pat=" + pat);

if (pat.length() == 0 && str.length() > 0) {

return false;

} else if (pat.length() == 0 && str.length() == 0) {

return true;

} else if (pat.charAt(0) == '.'){

return str.length() >= 1 && expMatch(str.substring(1), pat.substring(1));

}else if (pat.charAt(0) != '*'){

return str.length() >= 1 && pat.charAt(0) == str.charAt(0) && expMatch(str.substring(1), pat.substring(1));

}else{

// Now let's handle the tricky part

// (1) Look for the 1st non-star in pattern

int k=-1;

char ch = ' ';

for (int i=0; i

if (pat.charAt(i) != '*'){

k = i;

ch = pat.charAt(k);

break;

}

}

if (k==-1){

// (2A) only stars found in pattern, OK, any str matches that

return true;

}else{

// (2B) do full search now checking all

// possible candidate chars in str that

// match the char ch from pattern

for (int i=0; i

if (str.charAt(i)==ch){

boolean b = expMatch(str.substring(i+1), pat.substring(k+1));

if (b) return true;

}

}

return false;

}

}

}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何跳出if语句java,跳过Java if语句 的相关文章

随机推荐