2016-10-08 5 views
4

私は2次元マトリックスを持っており、最大値から最小値までの値を表示しようとしています。私は基本的に常に最大値を探すことでこれを行い、見つけたら1adjacencyMatrixに設定して、それを再びカウントしません。問題は、私が最初に出力したコードをテストし、最大のものを印刷してから2番目に大きいものをスキップしたときです。 3番目と4番目に大きな発見。もう少しスキップして、最後に0を印刷し始めました。私はしばらくの間、それを見つめてきたので、私も目の別のペアが役立つかもしれないバグを見つけることができません2D配列の値を降順で印刷するにはどうすればよいですか?

public static void findLongestPath(int rows, int columns, int[][] elevationMatrix, int[][] adjacencyMatrix) 
    { 
     int max = 0; 

     for (int x = 0; x < rows * columns; x++) 
     { 
      for (int i = 0; i < rows; i++) 
      { 
       for (int j = 0; j < columns; j++) 
       { 
        if (elevationMatrix[i][j] > max && adjacencyMatrix[i][j] == 0) 
        { 
         max = elevationMatrix[i][j]; 
         adjacencyMatrix[i][j] = 1; 
        } 
       } 
      } 

      System.out.println(max); 
      max = 0; 
     } 
    } 

は、ここに私のコードです。

P.S.私はそれをすることができないので、配列を並べ替えるよう教えてください。元の配列の順序を維持する必要があります。

+2

元の配列の1次元、サイズ 'rows * columns'をコピーしてソートします。 –

+0

@LouisWasserman私はそのポジションを失うだろう。これは大きなプログラムの一部であり、私は各価値の場所を知る必要があります。 –

+0

次に、位置と値を格納する 'Comparable'を実装するクラスを作成し、それらをソートします。 –

答えて

1
public static void findLongestPath(int rows, int columns, int[][] elevationMatrix, int[][] adjacencyMatrix) 
    { 
     int max = 0; 
     int cX, cY; 

     for (int x = 0; x < rows * columns; x++) 
     { 
      for (int i = 0; i < rows; i++) 
      { 
       for (int j = 0; j < columns; j++) 
       { 
        if (elevationMatrix[i][j] > max && adjacencyMatrix[i][j] == 0) 
        { 
         max = elevationMatrix[i][j]; // possible max, xth iteration 
         cX = i; // store i 
         cY = j; // store j 
        } 
       } 
      } 

      System.out.println(max); // global max, xth iteration 
      max = 0; 
      // cX and cJ now point to coordinates of global max 
      // all the possible max value coordinates are ignored. 
      adjacencyMatrix[cX][cJ] = 1; 
     } 
    } 

私はあなたではなく、最大(可能max)を見つけることよりも、マトリックス(グローバル最大)を通して最大数を、見つけた後、adjacencyMatrix[][] = 1を設定する必要があると思います。

これを行うより効率的な方法がありますが、私はこのメソッドを実行する必要があることを指摘しています。

+0

なぜ、した。 –

+0

コメントを追加しました。それらを参照してください。それでもクリアされない場合は、コメントを削除してください。お手伝いします:-) –

0
public static void findLongestPath(int rows, int columns, int[][] elevationMatrix) 
{ 
    class PosAndValue implements Comparable<PosAndValue> { 
    final int x; 
    final int y; 
    final int value; 
    PosAndValue(int x, int y, int value) { 
     this.x = x; 
     this.y = y; 
     this.value = value; 
    } 
    public int compareTo(PosAndValue other) { 
     return Integer.compare(value, other.value); 
    } 
    } 
    PosAndValue[] array = new PosAndValue[rows * columns]; 
    for (int i = 0; i < rows; i++) { 
    for (int j = 0; j < columns; j++) { 
     array[i * columns + j] = new PosAndValue(i, j, elevationMatrix[i][j]); 
    } 
    } 
    Arrays.sort(array); 
    for (int i = array.length - 1; i >= 0; i--) { 
    System.out.println(array[i].value); 
    } 
} 
0

問題は、疑似ソートしようとしていることです。

すべての値のリストまたは1D配列を作成し、並べ替えます。メソッドでtemp配列を宣言すると、ガベージコレクションスレッドは最終的にそれを受け取るでしょう。

あなたのメソッドは〜10行になります。すべての値を一時配列に追加し、並べ替えて、すべての値を出力します。

int[] tempArr = new int[rows * columns]; 
for(int i = 0; i < rows; i++){ 
    for(int j = 0; j < columns; j++){ 
     tempArr[(i * col) + j] = elevationMatrix[i][j]; 
    } 
} 
Arrays.sort(tempArr); 
for(int x = (rows * columns) - 1; x >= 0; x--){ 
    System.out.println(tempArr[x]); 
} 
+0

OPは、彼らは元の位置を追跡する必要があると述べています。 –

+0

彼は元の配列の順序を保つ必要があると言いました。これはそうです。 –

+0

しかし、あなたが 'tempArr [x]'を見たときに、その値が元々入っていた 'elevationMatrix'のどの位置にあるのかをOPに伝えました。 –

関連する問題