2016-04-29 57 views
2

我正在寫一個函數,它檢索2d數組中每行的最大值,並返回一個1d數組,其中每個索引都是相對於2d數組的列行索引。java如何在二維數組中找到每行的最大值

舉例來說,如果我有一個二維數組:

{1,2,3} 
{4,5,6} 
{7,8,9} 

它應該返回的

{3,6,9} 

數組這裏是我到目前爲止的代碼:

double[] rowMaxes(double[][] nums) { 
    double [] count = new double [nums.length]; 
    for(int i = 0; i < count.length; i++){ 
     for(int x = 0; x < nums[0].length; x++){ 
      for(int n = 0; n < nums.length; n++){ 
       if(nums[x][n] > count[i]){ 
        count[i] = nums[x][n]; 
       } 
      } 
     } 
    } 
    return count; 
} 
+0

請參考我的Java 8班輪一個解決 –

回答

1

有沒有需要3個嵌套循環。你只需要兩個循環:

for(int i = 0; i < count.length; i++){ 
    for(int x = 0; x < nums[0].length; x++){ 
     if(nums[i][x] > count[i]){ 
      count[i] = nums[i][x]; 
     } 
    } 
} 
+1

的問題是,這是行不通負數是2d數組的最大值;只有正數 –

+0

@RandyHuang如果你的數組可能包含負數,你應該將'count'數組的所有元素初始化爲Integer.MIN_VALUE – Eran

+0

@RandyHuang它缺少'count [i] = nums [i] [0];'在第一個循環 –

0

你應該在進入循環之前找到行和列的長度。 如果您想考慮負數,請先將最大值定義爲最小負值。 您可以使用此

public static void main(String[] args) { 
     double count[][] = {{1,2,3,8},{4,6,5,9},{0,8,9,1}}; 
     int r = count.length; 
     int c= count[0].length; 
     double out[] = new double[r]; 
     for(int i = 0; i < r; i++){ 
      double max = Integer.MIN_VALUE; 
      for(int x = 0; x < c; x++){ 
       if(count[i][x] > max) 
        max = count[i][x]; 
      } 
      out[i] = max; 
     } 
     for(int i=0;i<r;i++) 
      System.out.println(out[i]); 

    } 
0
public static int[] getMaxOfRow(int arr[][]){ 
    int grtr[]=new int[arr.length]; 
    grtr[0]=arr[0][0]; 
    for(int i=0;i<arr.length;i++){ 
     for(int j=0;j<arr[0].length;j++){ 
      if(arr[i][j]>grtr[i]){ 
       grtr[i]=arr[i][j]; 
      } 
     } 
    } 
    return grtr; 
}                         
+0

歡迎來到stackflow,我們強烈建議您閱讀指南(這裏)[https://stackoverflow.com/help/how-to-answer]關於如何回答問題。 –

0

注意,如果行中的所有值都小於零代碼將無法正常工作。
當您創建一個新的數組時,它將被填充默認值 - 它是零。
因爲它需要在第一個循環count[i] = nums[i][0]中添加。

像這樣的事情

double[] rowMaxes(double[][] nums) { 
    double[] count = new double[nums.length]; 

    for (int i = 0; i < nums.length; i++) { 
     count[i] = nums[i][0]; 
     for (int j = 1; j < nums[i].length; j++) { 
      if (count[i] < nums[i][j]) { 
       count[i] = nums[i][j]; 
      } 
     } 
    } 

    return count; 
} 

如果使用Java 8中,您可以替換流和max方法內循環。

for (int i = 0; i < nums.length; i++) { 
    count[i] = Arrays.stream(nums[i]).max().getAsDouble(); 
} 
0

如果你喜歡,使其一條線,這是任何明確的循環解決方案:

Arrays.stream(nums).mapToInt((row) -> Arrays.stream(row).max().getAsInt()).max().getAsInt() 
相關問題