簡體   English   中英

在Java中推廣for循環

[英]Generalizing a for-loop in Java

我真的不知道如何描述我的問題,所以我只是展示一個代碼示例:

int[][][] mat;
int n;
int specificValue;

for (int i = 0; i < n; i++) {
    if(mat[i][n-i][3] != specificValue) {
        doStuff();
    }
}

我正在查找3d數組中的Integer值。 對於每個領域,我必須使用以下其中一個:

  • 從零到n的計數器
  • 計數器從n運行到零
  • 一個固定的價值

所以我試圖建立一個方法,可以避免我寫這個循環大約20次,但我失敗了,所以這就是我需要幫助的地方。 我的想法是這樣的:

search(Loop.UP, Loop.DOWN, Loop.FIXED);

其中“Loop”將是一個表示我的可能性的枚舉,但我不知道如何實現它,或者如果在Java中甚至可以在不對每種可能的組合進行硬編碼的情況下實現它。

希望你能幫忙:)


好的,更具體的...我的設置我正在通過這個3d數組繪制一個矢量,一個特定的對角線,我想知道這個矢量上的值是什么, 只有這個矢量。

並且因為繪制這樣一個向量的可能性不止一個,我想有一個更通用的方法來獲取這些值。 我的搜索可能就像這樣簡單

search(Loop.UP, Loop.FIXED, Loop.FIXED);   // one plane

這將是一個簡單的for循環與一個計數器,但也

search(Loop.DOWN, Loop.UP, Loop.UP);   // through all three planes
Path pathX = new Path.Up();
Path pathY = new Path.Down(n);
Path pathZ = new Path.Fixed(3);

for (int i = 0; i < n; i++) {
    if(mat[pathX.pos(i)][pathY.pos(i)][pathZ.pos(i)] != specificValue) {
        doStuff();  
    }
}

哪里

public interface Path {
    public int pos(int i);

    public static class Up implements Path {
         @Override public int pos(int i) { return i; }
    }

    public static class Down implements Path {
         private int n;
         public Down(int n) { this.n = n; }
         @Override public int pos(int i) { return n - i - 1; }
    }

    public static class Fixed implements Path {
         private int v;
         public Down(int v) { this.v = v; }
         @Override public int pos(int i) { return v; }
    }

我沒有使用枚舉,因為Down取決於n並且Fixed在一些值上。

您可以使用索引列表。 在Python中,它看起來像這樣:

LOOP_UP = 20
LOOP_DOWN = LOOP_UP + 20
LOOP_FIXED = LOOP_DOWN + 20

def indexesOfLoopType(loopType, val):
    if loopType == LOOP_UP:
        return range(val)    
    if loopType == LOOP_DOWN:
        return range(val, 0)
    return [val] * val # make a list [val, val, val... ] of length val

def search(loopFirstIndex, loopSecondIndex, loopThirdIndex):
    # use indexesOfLoopType() to get lists of indexes
    # use those lists to iterate over mat

我現在能想到的最好的是:

static final int UP = -2, DOWN = -1;

static void loop1(int[][][] A, int t1, int t2, int t3) {
    switch (t1) {
    case UP:
        for (int i = 0; i < A.length; i++)
            loop2(A[i], t2, t3);
        break;
    case DOWN:
        for (int i = A.length - 1; i >= 0; i--)
            loop2(A[i], t2, t3);
        break;
    default:
        loop2(A[t1], t2, t3);
    }
}

static void loop2(int[][] A, int t2, int t3) {
    switch (t2) {
    case UP:
        for (int i = 0; i < A.length; i++)
            loop3(A[i], t3);
        break;
    case DOWN:
        for (int i = A.length - 1; i >= 0; i--)
            loop3(A[i], t3);
        break;
    default:
        loop3(A[t2], t3);
    }
}

static void loop3(int[] A, int t3) {
    switch (t3) {
    case UP:
        for (int i = 0; i < A.length; i++) {
            // Do something with A[i] here, such as...
            System.out.println(A[i]);
        }
        break;
    case DOWN:
        for (int i = A.length - 1; i >= 0; i--) {
            // Do something with A[i] here, such as...
            System.out.println(A[i]);
        }
        break;
    default:
        // Do something with A[t3], such as...
        System.out.println(A[t3]);
    }
}

FIXED是唯一需要索引的選項,因此被編碼為索引。 UPDOWN不是索引,因此它們使用負數編碼。 用法就像是

public static void main(String[] args) {
    int[][][] m = { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
    loop1(m, DOWN, 1, UP);
}

使用我的System.out.println示例,輸出將是

7
8
3
4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM