2015-11-08 4 views
4

Требование состоит в сортировке строк двумерного массива. Я чувствую, что мой код очень близок к выполнению, но я не могу понять, почему он не отображает отсортированный массив. Я забыл упомянуть, что нам не разрешено использовать методы предварительной обработки. Проблема наиболее вероятна в методе sortRows. В любом случае, вот мой код:Сортировка двумерного массива по строкам

public class RowSorting 
{ 
    public static void main(String[] args) 
{ 
    double[][] numbers = new double[3][3]; 
    double[][] number = new double[3][3]; 
    int run = 0; 
    String answer = ""; 

    while (run == 0) 
    { 
     Scanner input = new Scanner(System.in); 
     System.out.print("Enter a 3-by-3 matrix row by row: "); 
     for(int row = 0; row < numbers.length; row++) 
     { 
     for(int column = 0; column < numbers[row].length; column++) 
      { 
      numbers[row][column] = input.nextDouble(); 
      } 
     } 
     for(int row = 0; row < numbers.length; row++) 
     { 
     for(int column = 0; column < numbers[row].length; column++) 
      { 
      System.out.print(numbers[row][column] + " "); 
      } 
     System.out.print("\n"); 
     } 
     System.out.println("The sorted array is: \n"); 
     number = sortRows(numbers); 
     for(int row = 0; row < number.length; row++) 
     { 
     for(int column = 0; column < number[row].length; column++) 
      { 
      System.out.print(number[row][column] + " "); 
      } 
     System.out.print("\n"); 
     } 




    System.out.print("\nWould you like to continue the program (y for yes or anything else exits): "); 
     answer = input.next(); 

     if(answer.equals("y")) 
     { 
     continue; 
     } 
     else 
     break; 
     } 




} 
public static double[][] sortRows(double[][] m) 
{ 
    for(int j = 0; j < m[j].length - 1; j++) 
    { 
    for(int i = 0; i < m.length; i++) 
    { 
     double currentMin = m[j][i]; 
     int currentMinIndex = i; 

     for(int k = i + 1; k < m[j].length; k++) 
     { 
     if(currentMin > m[j][i]) 
     { 
     currentMin = m[j][i]; 
     currentMinIndex = k; 
     } 
     } 
    if(currentMinIndex != i) 
    { 
    m[currentMinIndex][j] = m[j][i]; 
    m[j][i] = currentMin; 
    } 
    } 
    } 
    return m; 
} 
} 

ответ

1

Похоже, что этот блок:

if(currentMin > m[j][i]) 
    { 
    currentMin = m[j][i]; 
    currentMinIndex = k; 
    } 

никогда не произойдет. Поскольку вы только что присвоили currentMin m [j] [i] двум строкам перед ним. Я считаю, что вы хотите использовать k в этом случае при проверке. Что-то вроде

if (currentMin > m[j][k]){ 
    currentMin = m[j][k]; 
    currentMinIndex = k; 
} 
+1

О да! Огромное спасибо. Эта фиксированная часть моей проблемы, но я смог поиграть с ней, чтобы понять ее. Мне также пришлось перевернуть текущую переменнуюMinIndex и j. Огромное спасибо!!! –

0

Как указано в ergonaut, у вас есть проблемы с кодоблоком

if(currentMin > m[j][i]) ... 

, а также

m[currentMinIndex][j] = m[j][i]; 

Однако, у вас есть проблемы с для петель.

for(int j = 0; j < m[j].length - 1; j++) ... 
    for(int i = 0; i < m.length; i++) ... 

Оба эти элементарно структурированы. Вероятно, вы захотите обменять эти for-loops, чтобы исключить исключения индекса. Это также вызовет обращение к индексам вашего кода. И измените j-index for-loop, чтобы включить весь диапазон.

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