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

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;

}

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值