2009-01-23 92 views
7

我有一個'int[][]'的數組,代表了小網格的座標。每個座標都被賦予了自己的價值。例如array[0][4] = 28 ......Java int [] []數組 - 迭代和查找值

我有兩個問題。首先,我如何遍歷所有存儲的值。其次,我希望能夠輸入一個值並在返回的網格中有其特定的座標。什麼是最好的方法來解決這個問題?

謝謝你的幫助!

+0

如果這是家庭作業,你應該清楚這一點(除了使用作業標籤)。 – 2009-01-23 22:12:14

回答

23

您可與for循環迭代或增強的for循環:

for (int row=0; row < grid.length; row++) 
{ 
    for (int col=0; col < grid[row].length; col++) 
    { 
     int value = grid[row][col]; 
     // Do stuff 
    } 
} 

// Note the different use of "row" as a variable name! This 
// is the *whole* row, not the row *number*. 
for (int[] row : grid) 
{ 
    for (int value : row) 
    { 
     // Do stuff 
    } 
} 

第一個版本將是在「尋找座標」的問題最簡單的解決方案 - 只需檢查內部循環中的值是否正確。

3

迭代的值,用循環:

int[][] matrix 
//... 
for(int row[] : matrix) 
    for(int cell : row){ 
     //do something with cell 
    } 

訪問基於你需要某種雙重的HashMap的(看起來在java.util.HashMap中)的價值座標,但我知道沒有這樣做直接

+0

你可以用普通的hashmap來做到這一點。你只需要定義一個對象作爲同時具有兩個座標的Key。 – Herms 2009-01-23 20:53:39

+0

@Herms:他希望通過該值找到座標。所以關鍵必須是細胞價值。如果多個單元格可以具有相同的值,那麼事情將變得更加複雜,但它仍然可行 – user54579 2009-01-23 20:56:54

+0

我認爲這裏有另一個數據結構可能是一個壞主意。讓它們保持同步可能很困難。搜索整個表格可能會更好,儘管它會變慢。 – 2009-01-23 21:02:37

1

除非你的網格以某種方式排序,那麼你可能不會比蠻力搜索做得更好。

對於迭代,我認爲這將是這樣的(語法可能會關閉了一下,我還沒有處理的Java數組一會兒。):

int[][] grid; // just assuming this is already assigned somewhere 

for(int x = 0 ; x < grid.length ; x++) { 
    int[] row = grid[x]; 
    for(int y = 0 ; y < row.length ; y++) { 
    int value = row[y]; 
    // Here you have the value for grid[x][y] and can do what you need to with it 
    } 
} 

搜索你會可能需要使用它來迭代,然後一旦找到它就返回。

如果您可能會多次查找相同值的位置,那麼您可能需要使用哈希表來記憶結果。

2

遍歷網格中的所有元素試試這個:

int grid[][] = new int[10][10]; 

for(int i = 0; i < grid.length(); ++i) { 
    for(int j = 0; j < grid[i].length(); ++j) { 
     // Do whatever with grid[i][j] here 
    } 
} 
-1

有一般沒有辦法找到特定值的具體座標,除了通過數組去和尋找它。但是,如果數組中的值保證是唯一的(即每個值只出現在一個單元格中),則可以將一個單獨的數組保存爲索引,該索引存儲由該值索引的每個值的座標。

0

使用嵌套for循環遍歷x和y維度,它可以讓您遍歷每個值,一次一個。

對於輸入一個值,只要按照上面的方法進行操作即可,但要查找與所請求的值匹配的值。

0

如果您將所有這些集合都封鎖在單個類中,並且不以任何方式公開它們,您將會感到高興。

這意味着將您的搜索和查找例程也移到這個類中。

對於存儲,每個人都覆蓋迭代,添加散列表和查找。我把這個評論發表在nickolai的帖子上:

將新的Integer(ix + iy * 1000)存儲爲散列表中的值。如果你的y指數可以超過1000,那麼使用更大的數字 - 整數非常大。要獲取它,請使用ix = val%1000,iy = val/1000。

如果你的數組和哈希表被封裝在同一個類中,那麼你的代碼的其餘部分將非常容易編寫,並且更加簡潔。