You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java二维数组输出单词所有子串程序调试求助

问题排查与解决方案

嘿,刚接触Java和Stack Overflow的新手朋友别慌,我帮你找到了代码里导致二维数组无法正常输出的问题,主要出在totalSubs方法的子串生成逻辑上,咱们一步步来解决:

问题根源

你写的totalSubs方法里,子串生成的循环逻辑有点混乱:

  • while(loop < num)里的b变量和if((a+1) < (length +b))这个条件完全没必要,反而会限制子串的生成,导致部分子串无法被正确存入数组,甚至可能触发字符串索引越界的问题。
  • 原逻辑的变量设计绕了弯路,没有清晰地按“起始位置+结束位置”的方式遍历所有子串。

修正方案

我们重新写totalSubs方法,用更直观的方式生成所有子串:

  1. 外层循环控制子串的起始索引(从0到字符串长度-1)
  2. 内层循环控制子串的结束索引(从起始索引+1到字符串长度)
  3. 每次截取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:24:46