开发者社区 问答 正文

从其他数组中提取2D数组

这是与学校作业有关的,所以我被限制不要使用ArrayList或Array方法。

假设我有一个像这样的2D char [] []数组

ooooo
oxxoo
oxxxo
oxxoo

如果给定它的尺寸和起始点在中间(尺寸始终为奇整数),我应该构建哪种方法来创建新的char [] []数组?从原始数组开始,例如[1] [3],并且大小为3,新数组应该是它的“剪切”,例如

oxx
oxx
oxx

我想知道起始点是新数组的0,0,还是总是在旧数组的开始,但是这里围绕它构建新数组的中间点可以在任何地方。

展开
收起
垚tutu 2019-12-19 16:48:08 587 分享 版权
阿里云 AI 助理回答

理解你的需求后,我们可以使用基本的for循环来遍历和复制2D数组中指定区域的数据到新的2D数组中。这里的关键是确定新数组的起始点相对于原始数组的位置,以及如何根据给定的尺寸正确地进行数据复制。

假设你已经知道了新数组的尺寸(比如3x3)和在原始数组中的起始点坐标(例如[1][3]),你可以按照以下步骤编写方法:

public class ArrayCopyExample {
    public static void main(String[] args) {
        char[][] originalArray = {
            {'o', 'o', 'o', 'o', 'o'},
            {'o', 'x', 'x', 'o', 'o'},
            {'o', 'x', 'x', 'x', 'o'},
            {'o', 'x', 'x', 'o', 'o'}
        };
        
        int startX = 1; // 原始数组中的起始X坐标
        int startY = 3; // 原始数组中的起始Y坐标
        int newSize = 3; // 新数组的边长(假设为正方形)
        
        char[][] newArray = cutFromOriginal(originalArray, startX, startY, newSize);
        
        // 打印新数组以验证结果
        for (char[] row : newArray) {
            for (char c : row) {
                System.out.print(c + " ");
            }
            System.out.println();
        }
    }
    
    public static char[][] cutFromOriginal(char[][] original, int startX, int startY, int size) {
        if (size % 2 == 0 || size < 1) throw new IllegalArgumentException("Size must be an odd positive integer.");
        
        int halfSize = size / 2;
        char[][] newArray = new char[size][size];
        
        for (int newY = 0; newY < size; newY++) {
            for (int newX = 0; newX < size; newX++) {
                // 计算新数组索引映射到原始数组的索引
                int originalX = startX - halfSize + newX;
                int originalY = startY - halfSize + newY;
                
                // 确保不会越界
                if (originalX >= 0 && originalX < original[0].length && 
                    originalY >= 0 && originalY < original.length) {
                    newArray[newY][newX] = original[originalY][originalX];
                } else {
                    // 如果超出边界,可以决定填充默认值,这里用'.'表示空白
                    newArray[newY][newX] = '.';
                }
            }
        }
        
        return newArray;
    }
}

这段代码首先定义了一个cutFromOriginal方法,它接收原始数组、起始点坐标和新数组的尺寸作为参数。然后,通过双层循环遍历新数组的每个位置,并计算出该位置对应于原始数组的坐标。如果计算出的坐标在原始数组范围内,则复制该位置的字符;否则,可以选择性地处理越界情况,这里简单地用.填充了越界部分。

注意:此示例假定起始点位于原始数组的中间,并且新数组的大小为奇数。如果起始点可以在任意位置,你需要确保提供的起始点加上半尺寸不会导致负数或超过原数组边界,这可能需要在调用方法前进行额外的边界检查。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: