2011-09-23 82 views
2

我想要做的是打印一個二維數組中的最大數字,它是索引位置。我能找到最大的數字,但我似乎無法弄清楚如何打印它的索引位置。無論如何,這是我到目前爲止:如何從二維數組中找到索引

public static void main(String[] args) { 
    int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}}; 

    double max = arr[0][0]; 
    for (int i = 0; i < arr.length; i++) { 
     for (int j = 0; j < arr.length; j++) { 
      if (arr[i][j] > max) { 
       max = arr[i][j]; 

      } 
     } 
    } 
    System.out.println(max); 
    System.out.println(i + j); //No idea what I should be doing here, just trying out everything I can think of 

回答

1

存儲我,j當你更新最大。

1

你有一個二維數組,因此你需要知道兩個索引。把它們加在一起不會做,因爲你失去了哪一個。這個怎麼樣:

System.out.println("[" + i + "][" + j + "]"); 
3

現在,你應該始終得到2 * arr.length作爲最終值。這不是你可能在尋找的東西。它看起來像你想知道最大值的座標。要做到這一點,你需要緩存率的值,然後在以後使用它們:

public static void main(String[] args) { 
    int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}}; 
    int tmpI = 0; 
    int tmpJ = 0; 
    double max = arr[0][0]; 
    // there are some changes here. in addition to the caching 
    for (int i = 0; i < arr.length; i++) { 
     int[] inner = arr[i]; 
     // caches inner variable so that it does not have to be looked up 
     // as often, and it also tests based on the inner loop's length in 
     // case the inner loop has a different length from the outer loop. 
     for (int j = 0; j < inner.length; j++) { 
      if (inner[j] > max) { 
       max = inner[j]; 
       // store the coordinates of max 
       tmpI = i; tmpJ = j; 
      } 
     } 
    } 
    System.out.println(max); 
    // convert to string before outputting: 
    System.out.println("The (x,y) is: ("+tmpI+","+tmpJ+")"); 
+0

非常感謝。我在過去的兩個小時裏嚇了一跳..... 我其實嘗試了類似於tmpI和tmpJ的東西,但沒有成功。我和你所做的事情之間的區別在於,我沒有在開始時將該值設置爲0。 – MNX1024

+0

@ MNX1024適用於我們所有人。 – cwallenpoole

+0

剛剛意識到你編輯的代碼。你原來是什麼,我正在尋找。我在這裏發佈的只是一個測試,我正在做的是在修改它並在另一個程序中使用它之前正確地運行代碼。無論如何,我還有一個問題。如果我要將它放入方法中,並且希望在單個return語句中返回i和j。可能嗎?如果是的話,我該怎麼做? – MNX1024

1

這將是,如果你想要一個索引到一個扁平化陣列:

public static void main (String[] args) throws java.lang.Exception 
{ 
     int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}}; 
      int[] flattened = new int[6*3]; // based off above 
      int maxIndex = 0; 
      double max = arr[0][0]; 
      for (int i = 0; i < arr.length; i++) { 
       for (int j = 0; j < arr.length; j++) { 
        flattened[i + j] = arr[i][j]; 
        if (arr[i][j] > max) { 
         max = arr[i][j]; 
         maxIndex = i+j; 
        } 
       } 
     } 
    System.out.println(max); 
    System.out.println(flattened [maxIndex]); 
} 
0

唐不確定你是否實現了有效的算法,但是當你設置最大值時,爲什麼你只是不把索引i,j保存在另一個變量中。 這很簡單。

if (arr[i][j] > max) { 
    max = arr[i][j]; 
    maxX = i; 
    maxY = j; 
} 

供參考如果你想看看「插入排序」算法,如果你想更好的實施。

2

小心你的數組尺寸!你們大多數人的第二個陳述是錯誤的。它應該去達改編[I]。長度

for (int i = 0; i < arr.length; i++) { 
    for (int j = 0; j < arr[i].length; j++) { 
     if (arr[i][j] > max) { 
      max = arr[i][j]; 
      tmpI = i; tmpJ = j; 
     } 
    } 
} 
1
int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}}; 

int max = arr[0][0]; 
int maxI = 0, maxJ = 0; 

for (int i = 0; i < arr.length; i++) { 
    for (int j = 0; j < arr.length; j++) { 
     if (arr[i][j] > max) { 
      max = arr[i][j]; 
      maxI = i; 
      maxJ = j; 
     } 
    } 
} 
System.out.println(max); 
System.out.println(maxI + "," + maxJ); 
1
//C++ code 
#include<iostream> 
#include<vector> 
#include<algorithm> 
using namespace std; 
vector<int> b; 
vector<int> c; 
int Func(int a[][10],int n) 
{ 
    int max; 
    max=a[0][0]; 
    for(int i=0;i<n;i++) 
    { 
      for(int j=0;j<n;j++) 
      { 
        if(a[i][j]>max) 
        { 
            max=a[i][j]; 
            b.push_back(i); 
            c.push_back(j); 
            } 

        } 
        } 
        b.push_back(0); 
        c.push_back(0); 
        return max; 
        } 
    void display(int a[][10],int n) 
    { 
     for(int i=0;i<n;i++) 
    { 
      for(int j=0;j<n;j++) 
      { 
        cout<<a[i][j]<<"\t"; 
        } 
        cout<<endl; 
        } 
        } 

int main() 
{ 
    int a[10][10],n; 
    cin>>n; 
    for(int i=0;i<n;i++) 
    { 
      for(int j=0;j<n;j++) 
      { 
        cin>>a[i][j]; 
        } 
        } 
        cout<<endl; 
        display(a,n); 
        cout<<endl; 
        cout<<Func(a,n)<<" is the greatest "<<endl; 
        if(b.size()==1&&c.size()==1) 
        { 
              cout<<"Location is (1,1)"<<endl; 
              } 
              else 
              { 
               b.erase(b.end() - 1); 
               c.erase(c.end() - 1); 
        cout<<"Location is "<<"("<<b.back()+1<<","<<c.back()+1<<")"<<endl; 
        } 
        return 0; 
        } 
+0

我不知道你爲什麼在java問題上發佈C++代碼,除非你只是想進一步迷惑他... – sreya

+0

這是一個java問題。將來,請使用一般概念或Java回答java問題。 –

1

你只是增加指數i和j在一起,然後將它打印到屏幕。由於您正在運行整個循環,因此它將等於2 * arr.length-2。當您遇到新的最大值時,您需要做的是存儲i和j的值。

例如:

int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}}; 

int max = arr[0][0]; //dunno why you made it double when you're dealing with integers 
int max_row=0; 
int max_column=0; 
for (int i = 0; i < arr.length; i++) { 
    for (int j = 0; j < arr.length; j++) { 
     if (arr[i][j] > max) { 
      max = arr[i][j]; 
      max_row=i; 
      max_column=j; 

     } 
    } 
System.out.println("The max is: "+max+" at index ["+max_row+"]["+max_column+"]");