2015-11-06 98 views
0

我有3×3的矩阵,它看起来像查找以矩阵位置

后面的每个数字是一个东西。 所以我写了这个代码,它将返回当前矩阵中的哪个位置。但它感觉非常重复,我很好奇是否可以优化这段代码。如果是这样,怎么样?

public int findPos(int i, int k) { 
    if (i == 0 && k == 0) { 
     return 1; 
    } 
    if (i == 0 && k == 1) { 
     return 2; 
    } 
    if (i == 0 && k == 2) { 
     return 3; 
    } 
    if (i == 1 && k == 0) { 
     return 4; 
    } 
    if (i == 1 && k == 1) { 
     return 5; 
    } 
    if (i == 1 && k == 2) { 
     return 6; 
    } 
    if (i == 2 && k == 0) { 
     return 7; 
    } 
    if (i == 2 && k == 1) { 
     return 8; 
    } 
    if (i == 2 && k == 2) { 
     return 9; 
    } 

    return 0; 
} 

的方法是在这种类型的时装后应用

if (myMatrix[i][k] == 2) { 
    position = findPos(i, k); 
    drawAtPos(position); 
} 

回答

1

能只能把它隐蔽于:

public int findPos(int i, int k) { 
    if (0 <= i && i < COLUMN_COUNT && 0 <= k && k < row_COUNT){ // out of bounds 
     return 0; 
    } 
    return (i * 3) + (k + 1); 
} 

这一切正在做的是减少你的条件为数学,因为每个列向右返回每个位置1的偏移量,并且每行需要增加3.

对于更通用的解决方案,它将是:

public int findPos(int i, int k) { 
    if (0 <= i && i < COLUMN_COUNT && 0 <= k && k < row_COUNT){ // out of bounds 
     return 0; 
    } 
    return (i * COLUMN_COUNT) + (k + 1); 
} 

其中,COLUMN_COUNT是您拥有的列数。因此,将工作的事情,如:

1 2 3 4 5 6 
7 8 9 10 11 12 

其中COLUMN_COUNT = 6

+0

这似乎工作,你能解释为什么吗? – Michael

1

你可以计算出你的位置:

if (0 <= i && i < 3 && 
     0 <= k && k < 3) {  
    // number of rows passed * size of each row + current column + 1 for 0-to-1-based-conversion 
    return (i * 3) + (k + 1); 
} else { 
    return 0; 
} 
1

什么是与这事?

(i*3 + k) + 1 

它为什么有效?那么,从你的矩阵中减去1,所以它看起来是这样的:

0 1 2 
3 4 5 
6 7 8 

所以它应该是显而易见的。