2013-09-01 3 views
0
 class arrayDemo { 

      static void sort2D(int[][] B) { 

      boolean swap = true; 
      int oy=0; 
      int temp=0; 

      for(int ox=0;ox<B.length;ox++){ 
       while(oy<B[ox].length) { 
        while(swap) { 
        swap = false; 
         for(int ix=0;ix<B.length;ix++) { 
          for(int iy=0;iy<B[ix].length;iy++) { 
            if(B[ox][oy]<B[ix][iy]) { 
            temp = B[ix][iy]; 
            B[ix][iy] = B[ox][oy]; 
            B[ox][oy] = temp; 
            swap = true; 
            } 
           } 
          }   
        } 
       oy++; 
       } 
      } 
      for(int row=0;row<B.length;row++) 
      for(int col=0;col<B[row].length;col++) 
      System.out.println(B[row][col]); 
      } 

public static void main(String...S) { 

    int y[][] = {{10,20,0,30},{10,5,8},{3,9,8,7},{2,3}}; 
    sort2D(y); 
}  
} 

Я пытаюсь сортировать 2D-массив в порядке возрастания.Сортировка 2D-массива в порядке возрастания

Ввод: {{10,20,0,30}, {10,5,8}, {3,9,8,7}, {2,3}}; Выход: 30,20,10,10,9,8,8,7,5,3,0,2,3

Может кто-нибудь помочь мне узнать, что не так с моим кодом.

+1

Является ли это домашнее задание? Можете ли вы использовать стандартные утилиты JDK? – arshajii

+0

Да, это задание. Я должен разработать свою собственную логику, не могу использовать утилиты JDK. – victorh

+0

Когда я запускаю этот код, я получаю 'ArrayIndexOutOfBoundsException'. – tbodt

ответ

0

Вы сравниваете элементы, которые не находятся в одной строке или столбце. Каждый отдельный массив должен сортироваться по отдельности. Возможно, вы захотите пересмотреть эту строку if (B[ox][oy] < B[ix][iy]).

+0

Я только что обновил свой код, заботясь о своих предыдущих ошибках. Теперь я получаю вывод, но не в правильном порядке. Взгляни, пожалуйста. – victorh

+0

Основная структура метода должна быть для (row = 0; row Warren

+0

спасибо. Я ценю вашу помощь. – victorh

0

Этот код имеет ряд проблем.

  1. Он выбрасывает ArrayIndexOutOfBoundsException. Это связано с тем, что все тесты для цикла проверяются на B.length, что неверно для внутренних массивов.
  2. Вы сравниваете каждую пару элементов, но некоторые пары обращаются к другим парам, а пары с обратной стороной не должны проверяться. Вам необходимо ограничить объем вашего внутреннего набора циклов for, начиная с другого индекса.

Чтобы устранить все эти проблемы, путь наименьшего сопротивления состоит в том, чтобы сбрасывать 2D-массив в массив 1D и сортировать, что намного проще.

Вот код, который был испытан и показан на работу:

static void sort2D(int[][] B) { 

     int count = 0; 
     for (int[] is : B) 
      for (int i : is) 
       count++; 
     int[] A = new int[count]; 
     count = 0; 
     for (int[] is : B) 
      for (int i : is) 
       A[count++] = i; 

     int temp; 
     for (int i = 0; i < A.length; i++) 
      for (int j = i + 1; j < A.length; j++) 
       if (A[i] > A[j]) { 
        temp = A[i]; 
        A[i] = A[j]; 
        A[j] = temp; 
       } 
     for (int i = 0; i < A.length; i++) 
       System.out.print(A[i] + ","); 

} 
+0

Пожалуйста, взгляните на мой новый код, он обращается ко всем ошибкам, которые вы только что указали. Спасибо, что ответили. – victorh

Смежные вопросы