Java代码内层循环j值与input1.length()匹配逻辑疑问解析
关于Java循环中
j == input1.length()的逻辑疑问 问题背景
我对以下Java代码中第22行的if (j == input1.length())存在疑问:当input1为"Fi_er"(长度为5)时,内层循环的j从0开始遍历,若找到匹配的单词,j为何能等于input1的长度5,还请帮忙解释该逻辑。
package ClassTest3; public class IdentifyPosiibleWords { public static String identifyWords(String input1, String input2) { int i, j; input1 = input1.toUpperCase(); input2 = input2.toUpperCase(); String word = "", res = ""; String[] words = input2.split(":"); System.out.println(input1.length()); for (i = 0; i < words.length; i++) { word = words[i]; if (input1.length() == word.length()) { for (j = 0; j < input1.length(); j++) { if (input1.charAt(j) != '_' && input1.charAt(j) != word.charAt(j)) { break; } } if (j == input1.length()) { res = res + word + ":"; } } } return res.length() == 0 ? "ERROR-009" : res.substring(0, res.length() - 1); } public static void main(String[] args) { // TODO Auto-generated method stub String input1 = "Fi_er"; String input2 = "Fever:filer:Filter: Fixer:fiber:fibre:tailor:offer"; String output = identifyWords(input1, input2); System.out.println(output); } }
逻辑解释
这是因为内层for循环的执行规则:
- 内层循环的条件是
j < input1.length(),当input1长度为5时,j的初始取值范围是0、1、2、3、4(均满足小于5的条件)。 - 当某个单词完全符合匹配规则时,内层循环里的
break语句不会被触发:每一轮循环中,要么input1对应位置是_,要么和单词的对应字符相等,input1.charAt(j) != '_' && input1.charAt(j) != word.charAt(j)这个条件始终不成立,所以不会提前跳出循环。 - 循环会完整执行每一次迭代:j从0开始,每次执行完循环体后自增1。当j=4时,执行完循环体,j自增到5,此时检查
j < 5的条件,5不小于5,循环正常退出,此时j的值就是5,正好等于input1的长度。
举个具体例子,比如匹配单词FILER:
- j=0:input1字符是
F,和单词字符F相等,不触发break,j变为1 - j=1:input1字符是
I,和单词字符I相等,不触发break,j变为2 - j=2:input1字符是
_,条件里input1.charAt(j) != '_'不成立,整个判断为假,不触发break,j变为3 - j=3:input1字符是
E,和单词字符E相等,不触发break,j变为4 - j=4:input1字符是
R,和单词字符R相等,不触发break,j变为5 - 此时
j < 5不成立,循环结束,j=5,满足j == input1.length()的判断,这个单词会被加入结果集。
反之,如果单词不符合规则(比如FEVER),j=1时input1的I和单词的E不相等,且不是_,就会触发break,j停在1,不会达到5,也就不会被加入结果。
内容的提问来源于stack exchange,提问作者Sri Murugan G
相关产品推荐
相关产品推荐

