Java 通过二维数组重新启动迭代
我正在尝试通过2d数组重新启动迭代。我正在使用以下阵列进行测试: {{1,2,3},{4,5,6},{7,8,9} 我的toString方法的结果是1,2,3,4,5,6,7,8,9。 (使用下一个方法获取每个值的迭代器) 我要做的是给这个方法一个类似(array,1,2)的起点和终点,以得到这个结果: 6,7,8,9,1,2,3,4,5 我的gues是使用一个变量来检查位置。但在达到这个位置之前,我不知道如何重新开始迭代 当前代码:Java 通过二维数组重新启动迭代,java,arrays,iterator,Java,Arrays,Iterator,我正在尝试通过2d数组重新启动迭代。我正在使用以下阵列进行测试: {{1,2,3},{4,5,6},{7,8,9} 我的toString方法的结果是1,2,3,4,5,6,7,8,9。 (使用下一个方法获取每个值的迭代器) 我要做的是给这个方法一个类似(array,1,2)的起点和终点,以得到这个结果: 6,7,8,9,1,2,3,4,5 我的gues是使用一个变量来检查位置。但在达到这个位置之前,我不知道如何重新开始迭代 当前代码: import java.util.Iterator; pu
import java.util.Iterator;
public class IteratorForArray<T> implements Iterator<T> {
private T[][] array;
private boolean istZeilenweise, istVorwaerts, next;
private int zeile, zStart;
private int spalte, sStart, index;
private T wert;
public IteratorFuerArray2(T[][] array, boolean istZeilenweise, boolean istVorwaerts, int zStart, int sStart) {
this.array = array;
this.istZeilenweise = istZeilenweise;
this.istVorwaerts = istVorwaerts;
this.zStart = zStart;
this.sStart = sStart;
if (istVorwaerts) {
zeile = this.zStart;
spalte = this.sStart;
} else {
zeile = zStart;
spalte = sStart;
}
}
@Override
public boolean hasNext() {
if (istZeilenweise) {
if (this.istVorwaerts) {
next = (zeile < this.array.length && spalte < this.array.length);
} else {
next = (zeile >= 0) && spalte >= 0;
}
} else {
if (this.istVorwaerts) {
next = zeile < this.array.length && spalte < this.array.length;
} else {
next = zeile >= 0 && spalte >= 0;
}
}
return next;
}
@Override
public T next() {
if (!hasNext()) {
return null;
}
if (this.istZeilenweise == true) { // zeilenweise
if (this.istVorwaerts) { // vorwärts
wert = zeilenweiseVor();
} else { // rückwärts
wert = zeilenweiseRueck();
}
} else { // spaltenweise
if (this.istVorwaerts) { // vorwärts
wert = spaltenweiseVor();
} else { // rückwärts
wert = spaltenweiseRueck();
}
}
return wert;
}
private void resetVor() {
if (this.istZeilenweise) { // zeilenweise
if (spalte == this.array[zeile].length) {
spalte = 0;
zeile++;
}
} else { // spaltenweise
if (zeile == this.array[spalte].length) {
zeile = 0;
spalte++;
}
}
}
private void resetRueck() {
if (istZeilenweise) { // zeilenweise
if (spalte < 0) {
spalte = this.array[zeile].length - 1;
zeile--;
}
} else { // spaltenweise
if (zeile < 0) {
zeile = this.array[spalte].length - 1;
spalte--;
}
}
}
public T zeilenweiseVor() {
while (zeile < this.array.length) {
while (spalte < this.array[zeile].length) {
if (this.array[zeile][spalte] != null) {
wert = this.array[zeile][spalte];
spalte++;
resetVor();
return wert;
} else {
spalte++;
resetVor();
}
}
zeile++;
}
return wert;
}
public T zeilenweiseRueck() {
while (zeile >= 0) {
while (spalte >= 0) {
if (this.array[zeile][spalte] != null) {
wert = this.array[zeile][spalte];
spalte--;
resetRueck();
return wert;
} else {
spalte--;
resetRueck();
}
}
zeile--;
}
return wert;
}
public T spaltenweiseVor() {
while (zeile < this.array.length) {
while (spalte < this.array[zeile].length) {
if (this.array[zeile][spalte] != null) {
wert = this.array[zeile][spalte];
zeile++;
resetVor();
return wert;
} else {
zeile++;
resetVor();
}
}
spalte++;
}
return wert;
}
public T spaltenweiseRueck() {
while (zeile >= 0) {
while (spalte >= 0) {
if (this.array[zeile][spalte] != null) {
wert = this.array[zeile][spalte];
zeile--;
resetRueck();
return wert;
} else {
zeile--;
resetRueck();
}
}
spalte--;
}
return wert;
}
public String toString() {
String ausgabe = "";
while (hasNext()) {
ausgabe += next();
if (hasNext()) {
ausgabe += ", ";
} else {
ausgabe += ".";
}
}
return ausgabe;
}
import java.util.Iterator;
公共类迭代器ForArray实现迭代器{
专用T[][]阵列;
私有布尔值istZeilenweise,istVorwaerts,next;
私人国际酒店,zStart;
私有int-spalte、sStart、index;
私人T-wert;
公共迭代器fuerarray2(T[][]数组,布尔istZeilenweise,布尔istVorwaerts,int-zStart,int-ssStart){
this.array=数组;
this.istZeilenweise=istZeilenweise;
this.istVorwaerts=istVorwaerts;
this.zStart=zStart;
this.sStart=sStart;
if(istVorwaerts){
zeile=this.zStart;
spalte=this.sStart;
}否则{
zeile=zStart;
spalte=sStart;
}
}
@凌驾
公共布尔hasNext(){
如果(istZeilenweise){
如果(此为istVorwaerts){
next=(zeile=0)和&spalte>=0;
}
}否则{
如果(此为istVorwaerts){
next=zeile=0&&spalte>=0;
}
}
下一步返回;
}
@凌驾
公共交通工具{
如果(!hasNext()){
返回null;
}
如果(this.istZeilenweise==true){//zeilenweise
如果(this.istVorwaerts){//vorwärts
wert=zeilenweiseVor();
}否则{//rückwärts
wert=ZeilenWeserueck();
}
}else{//spaltenweise
如果(this.istVorwaerts){//vorwärts
wert=spaltenweiseVor();
}否则{//rückwärts
wert=SPALTENWESERUECK();
}
}
返回wert;
}
私人无效重置VOR(){
如果(this.istZeilenweise){//zeilenweise
if(spalte==this.array[zeile].length){
spalte=0;
zeile++;
}
}else{//spaltenweise
if(zeile==this.array[spalte].length){
zeile=0;
spalte++;
}
}
}
私有无效重置{
如果(istZeilenweise){//zeilenweise
如果(spalte<0){
spalte=this.array[zeile].length-1;
泽尔--;
}
}else{//spaltenweise
if(zeile<0){
zeile=this.array[spalte].length-1;
垃圾--;
}
}
}
公共T zeilenweiseVor(){
while(zeile=0){
而(spalte>=0){
if(this.array[zeile][spalte]!=null){
wert=this.array[zeile][spalte];
垃圾--;
resetRueck();
返回wert;
}否则{
垃圾--;
resetRueck();
}
}
泽尔--;
}
返回wert;
}
公共T spaltenweiseVor(){
while(zeile=0){
而(spalte>=0){
if(this.array[zeile][spalte]!=null){
wert=this.array[zeile][spalte];
泽尔--;
resetRueck();
返回wert;
}否则{
泽尔--;
resetRueck();
}
}
垃圾--;
}
返回wert;
}
公共字符串toString(){
字符串ausgabe=“”;
while(hasNext()){
ausgabe+=next();
if(hasNext()){
ausgabe+=“,”;
}否则{
ausgabe+=”;
}
}
返回ausgabe;
}
}
谢谢你的建议 所有字段和变量名都是德语,这有点难理解,但逻辑如下:
- 保存起始位置(
,s1
)s2
- 将索引字段(
,i1
)设置为起始位置i2
- 每次调用next时,递增
。i2
- 如果内部数组结束,则将
重置为0(环绕),并递增i2
i1
- 如果外部阵列结束,则将
重置为0(环绕)i1
- 如果内部数组结束,则将
- 如果
您已经到达终点,并停在那里i1==s1&&i2==s2
i1==s1&&i2==s2
在开头和结尾都是真的,所以需要一个布尔字段来跟踪差异
由于“istVorwaerts”表示“isForward”,而“istZeilenweise”表示“isLinewise”,或者类似的,您当然会调整上面描述的逻辑以处理这4种情况,就像您已经在做的一样,这样您就可以在所有4个方向上迭代2D数组 考虑到有非常多的
for (MyClass obj : IterableArray2.up(myarray, 1, 2)) {
// code here
}