2016-10-08 8 views
4

그래서 저는 2D 행렬을 가지고 있으며 가장 큰 값에서 가장 작은 값까지 출력하려고합니다. 기본적으로 항상 최대 값을 찾아이 값을 찾으면 1에 해당하는 위치를 adjacencyMatrix에 설정하여 다시 계산하지 않습니다. 문제는 내가 가장 큰 것을 인쇄하여 올바르게 시작한 코드를 테스트 한 후 두 번째로 큰 것을 건너 뛴 경우입니다. 그 다음 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. 제발, 제발 배열을 정렬하지 말아주세요. 그렇게 할 수 없기 때문에. 원본 배열의 순서를 유지해야합니다.

+2

원본 배열의 크기가 '행 * 열'인 1 차원 크기를 만들고 정렬합니다. –

+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; 
     } 
    } 

나는 당신이 매트릭스 (세계 최대)에 걸쳐 가장 큰 번호를 찾을 후 오히려 최대 (가능한 최대를) 찾는 것보다, 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에서 언급되었으므로 필요하지 않습니다. –

관련 문제