如何提取矩阵每一列的首个字符并重组?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(""); } } }
代码存在的问题分析
- 输入读取逻辑错误:使用
Scanner.next()只能读取单个单词,无法获取包含空格的完整输入,导致输入nem ava ma时只能拿到nem,自然无法处理后续内容。 - 需求理解偏差:你的代码是将无空格字符串转为行列数由平方根计算的矩阵,但你的真实需求是将空格分隔的单词作为矩阵的行,按列重组字符。
- 字符串处理无效:
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()); } }
代码说明
- 输入处理:用
nextLine()读取完整输入,再通过split("\\s+")分割成单词数组,每个单词对应矩阵的一行。 - 列数确定:遍历所有单词,取最长单词的长度作为矩阵的总列数,确保能覆盖所有单词的字符。
- 按列重组:外层循环遍历列索引,内层循环遍历每一行(单词),如果当前单词在该列有字符,就添加到列单词的拼接器中,最后将所有列单词用空格连接输出。
- 示例验证:输入
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,完全符合你的示例需求。
- 列0:取每个单词的第0个字符 →
内容的提问来源于stack exchange,提问作者Nemanja Ilic
相关产品推荐
相关产品推荐

