Java 数组环绕
Java Array Wrap Around
嗨,我想知道如何包装数组
例如下面的数组:
|00 01 02 03 04 05 06 07|
说我想把所有事情都做对,为了做到这一点:
|07 00 01 02 03 04 05 06|
如何在不丢失任何数据的情况下执行此操作?
要将内容向右移动,我目前正在使用此代码:
public void transform(IFrame frame) {
char tempImage;
for (int i = 0; i < frame.getNumRows(); i++) {
for (int j = 0; j < frame.getNumRows(); j++) {
tempImage = frame.getChar(i,j);
frame.setChar(i+1, j, tempImage);
}
本质上,我希望代码以非常基本的方式执行的操作是:
遍历每个 row/column(frame.getNumRows,因为框架是方形的,所以 rows/columns 是相同的
从帧中获取i和j的char值
-对于该帧,将 i 和 j 的帧字符值设置为 i+1,同时保持 j 相同
-要设置的字符为临时图像
更新
我已经实现了这个方法,并从之前发布的方法中进行了更改,下面是更新后的代码:
public void transform(IFrame frame) {
char constantImage;
for (int i = 0; i < frame.getNumRows(); i++) { //go through each row/column
for (int j = 0; j < frame.getNumRows(); j++) {
constantImage = frame.getChar(i, j);
TransformFrames.add(constantImage);
Collections.rotate(Arrays.asList(TransformFrames), 1);
for (Character f : TransformFrames) {
frame.setChar(i, j, f);
}
}
}
}
TransformFrames 是一个字符数组列表。
通过调试,我可以看到正确的数据被添加到数组列表中,我希望被移动,但是我看不到这种情况的发生,因为调用此方法后 gui 没有更新 - 任何建议为什么或如何解决?
谢谢
我相信,一个众所周知的解决方案是:
你有
|00 01 02 03 04 05 06 07|
再次将相同的数组添加到末尾:
|00 01 02 03 04 05 06 07 00 01 02 03 04 05 06 07|
现在,围绕索引 i
的数组只是这个新数组的子数组,从索引 i
开始,长度与初始数组相同:
01 02 03 04 05 06 07 00
02 03 04 05 06 07 00 01
03 04 05 06 07 00 01 02
等等
一个简单的方法是 Collections.rotate:
Collections.rotate(Arrays.asList(array), 1);
首先,这很可能是一个"XY Problem"。你有一些问题要解决,但你什么也没告诉我们,你认为为了解决你的问题你需要做的是旋转一个数组,(是的,rotating 是用于此的术语,)并且您在问我们如何旋转数组。 (参见:http://xyproblem.info)换句话说,你是要我们解决一些"X"问题,而实际上你要解决的是之前出现的"Y"问题,所以它将 "Y" 问题告诉我们对所有相关人员都是有益的。但是,让我们继续这个问题。
覆盖要移动的元素的问题是一个众所周知的问题,有一个众所周知的解决方案:
如果要向左旋转,从左向右复制元素,即升序.
如果要向右旋转,从右向左复制元素,即降序.
仅此而已。
然后当然,在 java 中,有 System.arrayCopy()
,它会为您做到这一点,而无需您重新发明轮子。
嗨,我想知道如何包装数组
例如下面的数组:
|00 01 02 03 04 05 06 07|
说我想把所有事情都做对,为了做到这一点:
|07 00 01 02 03 04 05 06|
如何在不丢失任何数据的情况下执行此操作?
要将内容向右移动,我目前正在使用此代码:
public void transform(IFrame frame) {
char tempImage;
for (int i = 0; i < frame.getNumRows(); i++) {
for (int j = 0; j < frame.getNumRows(); j++) {
tempImage = frame.getChar(i,j);
frame.setChar(i+1, j, tempImage);
}
本质上,我希望代码以非常基本的方式执行的操作是:
遍历每个 row/column(frame.getNumRows,因为框架是方形的,所以 rows/columns 是相同的
从帧中获取i和j的char值
-对于该帧,将 i 和 j 的帧字符值设置为 i+1,同时保持 j 相同
-要设置的字符为临时图像
更新
我已经实现了这个方法,并从之前发布的方法中进行了更改,下面是更新后的代码:
public void transform(IFrame frame) {
char constantImage;
for (int i = 0; i < frame.getNumRows(); i++) { //go through each row/column
for (int j = 0; j < frame.getNumRows(); j++) {
constantImage = frame.getChar(i, j);
TransformFrames.add(constantImage);
Collections.rotate(Arrays.asList(TransformFrames), 1);
for (Character f : TransformFrames) {
frame.setChar(i, j, f);
}
}
}
}
TransformFrames 是一个字符数组列表。
通过调试,我可以看到正确的数据被添加到数组列表中,我希望被移动,但是我看不到这种情况的发生,因为调用此方法后 gui 没有更新 - 任何建议为什么或如何解决?
谢谢
我相信,一个众所周知的解决方案是:
你有
|00 01 02 03 04 05 06 07|
再次将相同的数组添加到末尾:
|00 01 02 03 04 05 06 07 00 01 02 03 04 05 06 07|
现在,围绕索引 i
的数组只是这个新数组的子数组,从索引 i
开始,长度与初始数组相同:
01 02 03 04 05 06 07 00
02 03 04 05 06 07 00 01
03 04 05 06 07 00 01 02
等等
一个简单的方法是 Collections.rotate:
Collections.rotate(Arrays.asList(array), 1);
首先,这很可能是一个"XY Problem"。你有一些问题要解决,但你什么也没告诉我们,你认为为了解决你的问题你需要做的是旋转一个数组,(是的,rotating 是用于此的术语,)并且您在问我们如何旋转数组。 (参见:http://xyproblem.info)换句话说,你是要我们解决一些"X"问题,而实际上你要解决的是之前出现的"Y"问题,所以它将 "Y" 问题告诉我们对所有相关人员都是有益的。但是,让我们继续这个问题。
覆盖要移动的元素的问题是一个众所周知的问题,有一个众所周知的解决方案:
如果要向左旋转,从左向右复制元素,即升序.
如果要向右旋转,从右向左复制元素,即降序.
仅此而已。
然后当然,在 java 中,有 System.arrayCopy()
,它会为您做到这一点,而无需您重新发明轮子。