首页 > 解决方案 > 有没有办法用其他数组初始化二维数组?

问题描述

我的家庭作业如下:

从控制台应用程序中读取三个句子。每个句子不应超过 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

标签: javaarraysmultidimensional-array

解决方案


问题是,在您的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();
}

推荐阅读