Java二维数组输出单词所有子串程序调试求助
问题排查与解决方案
嘿,刚接触Java和Stack Overflow的新手朋友别慌,我帮你找到了代码里导致二维数组无法正常输出的问题,主要出在totalSubs方法的子串生成逻辑上,咱们一步步来解决:
问题根源
你写的totalSubs方法里,子串生成的循环逻辑有点混乱:
while(loop < num)里的b变量和if((a+1) < (length +b))这个条件完全没必要,反而会限制子串的生成,导致部分子串无法被正确存入数组,甚至可能触发字符串索引越界的问题。- 原逻辑的变量设计绕了弯路,没有清晰地按“起始位置+结束位置”的方式遍历所有子串。
修正方案
我们重新写totalSubs方法,用更直观的方式生成所有子串:
- 外层循环控制子串的起始索引(从0到字符串长度-1)
- 内层循环控制子串的结束索引(从起始索引+1到字符串长度)
- 每次截取
s1.substring(start, end),存入结果数组即可。
同时,为了避免用户输入不等长单词导致的错误,我们可以加个简单的校验逻辑(毕竟你要求输入等长单词,但防错很重要)。
修正后的完整代码
//Ari import javax.swing.JOptionPane; public class twoDArrays { public static void main (String[] args) { String totalWords = JOptionPane.showInputDialog(null,"How Many Words?"); int val = Integer.parseInt(totalWords); String[] words = new String[val]; // 输入单词并校验长度 for (int i =0; i<val; i++) { words[i]= JOptionPane.showInputDialog(null,"Enter Words"); // 从第二个单词开始校验长度是否和第一个一致 if (i > 0 && words[i].length() != words[0].length()) { JOptionPane.showMessageDialog(null, "请输入等长单词!"); // 重新输入当前单词 i--; } } // 输出一维数组形式的单词 System.out.println("输入的单词:"); for (String word : words) { System.out.print(word + " "); } System.out.println("\n"); int len = words[0].length(); int subs = ((len)*(len+1))/2; String table [][] = new String[val][subs]; for(int i=0; i<val; i++) { String [] temp = totalSubs(words[i]); // 把生成的子串数组赋值给二维数组的对应行 System.arraycopy(temp, 0, table[i], 0, temp.length); } // 输出二维数组形式的子串 System.out.println("每个单词的所有子串:"); for (int i= 0; i < table.length; i++) { System.out.print(words[i] + " 的子串:"); for (int a = 0; a< subs; a++) { System.out.print(table[i][a] + " "); } System.out.println(); } } // 修正后的子串生成方法 public static String[] totalSubs(String s1) { int length = s1.length(); int num = ((length)*(length+1))/2; String[] sub = new String[num]; int index = 0; // 遍历所有起始位置 for (int start = 0; start < length; start++) { // 遍历所有结束位置(从start+1到length) for (int end = start + 1; end <= length; end++) { sub[index] = s1.substring(start, end); index++; } } return sub; } }
关键修改点说明
totalSubs方法:用双层循环替代原有的复杂while逻辑,清晰遍历所有起始和结束位置,确保每个子串都被正确生成。- 长度校验:在输入单词时加入校验,避免用户输入不等长单词导致后续计算错误。
- 输出优化:增加了提示文字,让输出结果更易读。
现在运行代码,就能得到你预期的效果啦:先输出所有输入的单词,再逐行输出每个单词的所有子串~
内容的提问来源于stack exchange,提问作者Arif Rashid
相关产品推荐
相关产品推荐

