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

如何提取矩阵每一列的首个字符并重组?Java代码功能异常问题排查

如何实现提取矩阵每一列字符重组的功能?

我想要实现这样的功能:将输入的空格分隔的单词作为矩阵的行,提取每一列的所有字符并重组为新的单词,最终用空格分隔输出。举个例子:当输入内容为nem ava ma时,输出结果应为nam eva ma。

我编写了以下Java代码,但目前它仅能处理字符串的首个元素,无法完整实现矩阵相关的处理功能,希望能得到解决方法:

class Message { 
    public static void main(String[] args) { 
        Scanner s = new Scanner(System.in); 
        System.out.println("String without white spaces:"); 
        String str = s.next(); 
        str.replaceAll("\\s+", ""); 
        if (str.length() <= 81) { 
            System.out.println("in range"); 
        } else { 
            System.out.println("out of range"); 
        } 
        gridStr(str); 
    } 
    static void gridStr(String str) { 
        int l = str.length(); 
        int k = 0, row, column; 
        row = (int) Math.floor(Math.sqrt(l)); 
        column = (int) Math.ceil(Math.sqrt(l)); 
        if (row * column < l) { 
            row = column; 
        } 
        char s[][] = new char[row][column]; 
        for (int i = 0; i < row; i++) { 
            for (int j = 0; j < column; j++) { 
                if (k < str.length()) s[i][j] = str.charAt(k); 
                k++; 
            } 
        } 
        for (int i = 0; i < row; i++) { 
            for (int j = 0; j < column; j++) { 
                if (s[i][j] == 0) { 
                    break; 
                } 
                System.out.print(s[i][j]); 
            } 
            System.out.println(""); 
        } 
    } 
}

代码存在的问题分析

  1. 输入读取逻辑错误:使用Scanner.next()只能读取单个单词,无法获取包含空格的完整输入,导致输入nem ava ma时只能拿到nem,自然无法处理后续内容。
  2. 需求理解偏差:你的代码是将无空格字符串转为行列数由平方根计算的矩阵,但你的真实需求是将空格分隔的单词作为矩阵的行,按列重组字符。
  3. 字符串处理无效:str.replaceAll("\\s+", "")没有将结果赋值回str,因为Java的String是不可变类型,这个操作不会改变原字符串内容。

解决方案与修正代码

下面是针对你的需求编写的修正代码,完全匹配你给出的示例:

import java.util.Scanner;

class Message {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter your string (space-separated words):");
        // 读取完整的一行输入,包含所有空格分隔的单词
        String input = scanner.nextLine();
        
        // 将输入按空格分割成单词数组,作为矩阵的行
        String[] rows = input.split("\\s+");
        if (rows.length == 0) {
            System.out.println("No valid input");
            return;
        }
        
        // 确定矩阵的列数:取最长单词的长度
        int maxColumn = 0;
        for (String word : rows) {
            if (word.length() > maxColumn) {
                maxColumn = word.length();
            }
        }
        
        // 按列重组字符,生成结果
        StringBuilder result = new StringBuilder();
        for (int col = 0; col < maxColumn; col++) {
            StringBuilder columnWord = new StringBuilder();
            for (String row : rows) {
                // 如果当前单词的长度大于当前列索引,就取该位置的字符
                if (col < row.length()) {
                    columnWord.append(row.charAt(col));
                }
            }
            // 将每列组成的单词加入结果,用空格分隔
            if (result.length() > 0) {
                result.append(" ");
            }
            result.append(columnWord);
        }
        
        // 输出最终结果
        System.out.println("重组结果:" + result.toString());
    }
}

代码说明

  1. 输入处理:用nextLine()读取完整输入,再通过split("\\s+")分割成单词数组,每个单词对应矩阵的一行。
  2. 列数确定:遍历所有单词,取最长单词的长度作为矩阵的总列数,确保能覆盖所有单词的字符。
  3. 按列重组:外层循环遍历列索引,内层循环遍历每一行(单词),如果当前单词在该列有字符,就添加到列单词的拼接器中,最后将所有列单词用空格连接输出。
  4. 示例验证:输入nem ava ma时,单词数组是["nem", "ava", "ma"],最长长度是3:
    • 列0:取每个单词的第0个字符 → n+a+m = nam
    • 列1:取每个单词的第1个字符 → e+v+a = eva
    • 列2:取每个单词的第2个字符 → m+a = ma
      最终输出就是nam eva ma,完全符合你的示例需求。

内容的提问来源于stack exchange,提问作者Nemanja Ilic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:32:34