java - 有没有办法用其他数组初始化二维数组?
问题描述
我的家庭作业如下:
从控制台应用程序中读取三个句子。每个句子不应超过 80 个字符。然后,将每个输入句子中的每个字符复制到 [3 x 80] 字符数组中。
第一个句子应该以字符的相反顺序加载到第一行——例如,“mary had a little lamb”应该作为“bmal elttil a dah yram”加载到数组中。
第二个句子应该以单词的相反顺序加载到第二行——例如,“mary had a little lamb”应该作为“lamb little a had mary”加载到数组中。
第三句应该被加载到第三行,如果数组的索引可以被 5 整除,那么对应的字符被替换为字母 'z'——例如,“mary had a little lamb”应该被加载到数组为“mary zad azlittze lazb”——也就是说,索引位置 5、10、15 和 20 中的字符被替换为“z”。请注意,空格也是一个字符,并且索引从位置 0 开始。
现在在控制台上打印字符数组的内容。
下面代码中的方法、返回类型和参数都是根据需要指定的,因此我无法更改任何这些信息。我在初始化二维数组时遇到问题。说明说必须将句子加载到已经反转的数组中等,但是执行此操作的方法的参数需要字符串。我假设这意味着我应该将这些行作为字符串读取,然后调用方法来修改它们,然后在将它们加载到二维数组之前使用 toCharyArray 转换它们。我不明白如何用 char 数组的值初始化 2D 数组。我可以使用某种 for 循环吗?另一个问题是在 main 方法内部不能进行任何处理,但是在指令中没有可以调用的方法来填充数组。
import java.util.regex.Pattern;
public class ReversedSentence {
public static String change5thPosition(String s){
char[] chars = s.toCharArray();
for (int i = 5; i < s.length(); i = i + 5) {
chars[i] = 'z';
}
String newString = new String(chars);
return newString;
}
public static String printChar2DArray(char[][] arr){
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 80; y++) {
// just a print so it does not make new lines for every char
System.out.print(arr[x][y]);
}
}
return null;
}
public static String reverseByCharacter(String s){
String reverse = new StringBuffer(s).reverse().toString();
return reverse;
}
public static String reverseByWord(String s){
Pattern pattern = Pattern.compile("\\s"); //splitting the string whenever there
String[] temp = pattern.split(s); // is whitespace and store in temp array.
String result = "";
for (int i = 0; i < temp.length; i++) {
if (i == temp.length - 1)
result = temp[i] + result;
else
result = " " + temp[i] + result;
}
return result;
}
public static String truncateSentence(String s){
if (s==null || s.length() <= 80)
return s;
int space = s.lastIndexOf(' ', 80);
if (space < 0)
return s.substring(0, 80);
return s;
}
public static void main(String[] args) {
String sentence1 = ("No one was available, so I went to the movies alone.");
String sentence2 = "Ever since I started working out, I am so tired.";
String sentence3 = "I have two dogs and they are both equally cute.";
char[][] arr = new char[3][80];
arr[0] = reverseByCharacter(sentence1).toCharArray();
arr[1] = reverseByWord(sentence2).toCharArray();
arr[2] = change5thPosition(sentence3).toCharArray();
printChar2DArray(arr);
}
}
我得到的错误是:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 52 out of bounds for length 52
at ReversedSentence.printChar2DArray(ReversedSentence.java:20)
at ReversedSentence.main(ReversedSentence.java:71)
.enola seivom eht ot tnew I os ,elbaliava 看到了 eno on
解决方案
问题是,在您的printChar2DArray
方法中,您假设每个数组的长度为 80,但实际上并非如此。在 Java 中,二维数组只是数组的数组。所以,当你有这个: 时char[][] arr = new char[3][80]
,你正在创建一个由 3 个数组组成的数组,每个数组的长度为 80 个字符。这似乎没问题,但在接下来的几行中,您将使用完全不同的东西重新初始化 3 个数组。
arr[0] = reverseByCharacter(sentence1).toCharArray();
arr[1] = reverseByWord(sentence2).toCharArray();
arr[2] = change5thPosition(sentence3).toCharArray();
现在这些数组都没有长度为 80。它们每个都有各自字符串的长度。
您可以通过 2 种方式解决此问题(取决于您的任务实际受到的限制)。
首先,您可以将字符串复制到数组中,而不是将数组分配给toCharArray
方法的结果。您可以通过一个简单的循环来实现这一点,但我不推荐这种方法,因为您最终会得到 80 个字符的数组,即使字符串包含的字符更少。
String firstSentence = reverseByCharacter(sentence1);
for (int i = 0; i < firstSentence.length(); i++) {
arr[0][i] = firstSentence.charAt(i);
}
或者:
char[] firstSentence = reverseByCharacter(sentence1).toCharArray();
for (int i = 0; i < firstSentence.length; i++) {
arr[0][i] = firstSentence[i];
}
其次,您可以在方法中放弃对数组长度的假设printChar2DArray
。我推荐这种方法,因为它使您的代码更加灵活。然后,您的printChar2DArray
方法将如下所示:
public static String printChar2DArray(char[][] arr){
for (int x = 0; x < arr.length; x++) {
for (int y = 0; y < arr[x].length; y++) {
// just a print so it does not make new lines for every char
System.out.print(arr[x][y]);
}
}
return null;
}
您可以看到我已经用字段替换了数字,该length
字段可以访问任何数组。
此外,这样您就不需要初始化内部数组,因为无论如何您都会在下一行重新初始化它们。
char[][] arr = new char[3][];
arr[0] = reverseByCharacter(sentence1).toCharArray();
arr[1] = reverseByWord(sentence2).toCharArray();
arr[2] = change5thPosition(sentence3).toCharArray();
但是这种方法可能不适合您的任务,因为句子可以是任意长度,并且最多不会包含 80 个字符。
更新- 回答评论中的问题
要打印换行符,您可以System.out.println()
不带参数使用。这比将换行符放入数组要好,因为它不是句子的逻辑部分。
所以你的for
-loopprintChar2DArray
看起来像这样:
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 80; y++) {
// just a print so it does not make new lines for every char
System.out.print(arr[x][y]);
}
System.out.println();
}
推荐阅读
- apache-kafka - 基于 kafka 的多点订购服务的真正用途是什么
- c# - Azure 函数部署错误:您的函数应用面向 V1,但 Azure 主机的函数版本为 V2,
- c++ - 检查两个对象组合的空值的最佳方法
- javascript - 垂直滚动条在 IE8/IE9 中不起作用
- visual-studio-2017 - 切换回 packages.config - 澄清答案
- kubernetes - Kubernetes 上的日志记录和事件跟踪器
- node.js - 如何将 use() 的实例应用于除 app.use(express.static("dist")) 传递的路由之外的所有路由?
- css - 即使在更改版本、硬刷新和清除缓存后 CSS 更改也不会反映
- javascript - 如何在javascript中验证之前修剪非必填字段
- python - 关于用户名和密码加密