这是与学校作业有关的,所以我被限制不要使用ArrayList或Array方法。
假设我有一个像这样的2D char [] []数组
ooooo
oxxoo
oxxxo
oxxoo
如果给定它的尺寸和起始点在中间(尺寸始终为奇整数),我应该构建哪种方法来创建新的char [] []数组?从原始数组开始,例如[1] [3],并且大小为3,新数组应该是它的“剪切”,例如
oxx
oxx
oxx
我想知道起始点是新数组的0,0,还是总是在旧数组的开始,但是这里围绕它构建新数组的中间点可以在任何地方。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
理解你的需求后,我们可以使用基本的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
方法,它接收原始数组、起始点坐标和新数组的尺寸作为参数。然后,通过双层循环遍历新数组的每个位置,并计算出该位置对应于原始数组的坐标。如果计算出的坐标在原始数组范围内,则复制该位置的字符;否则,可以选择性地处理越界情况,这里简单地用.
填充了越界部分。
注意:此示例假定起始点位于原始数组的中间,并且新数组的大小为奇数。如果起始点可以在任意位置,你需要确保提供的起始点加上半尺寸不会导致负数或超过原数组边界,这可能需要在调用方法前进行额外的边界检查。