2D пузырьковая сортировка java программа с массивом строк и целых чисел - PullRequest
2 голосов
/ 25 марта 2020

Я не знаю, где проблема. При компиляции он не сортирует числа. Что мне делать? Сильно нужен выходной в нашей школе. Заранее спасибо!

public class Qwerty {
  static void bubbleSort(String arr[][]) {
  int n = arr.length;
  int temp = 0;
  int []myAge = new int[n];

  for(int i = 0; i < n; i++) {
     for(int j=1; j < n-i-1; j++) 
     {
        myAge[j] = Integer.parseInt(arr[j][1]);
        if(myAge[j-1] > myAge[j]) {
           temp = myAge[j-1];
           myAge[j-1] = myAge[j];
           myAge[j] = temp;
        }
     }
  }
}
public static void main(String[] args) {

   Qwerty bs = new Qwerty();
   String arr [][] = {{"Ace","10"},
                     {"Ben","8"},
                     {"Cid","20"},
                     {"Dan","5"}, 
                     {"Eve","12"}};
   bs.bubbleSort(arr);
   for(int i = 0; i < arr.length; i++) {
     System.out.println(arr[i][0]+arr[i][1]);
   }
}

1 Ответ

3 голосов
/ 25 марта 2020

Это должно работать. Я go рассмотрю несколько ошибок, которые вы допустили в своем коде.

public class Qwerty{
  static int[] bubbleSort(String arr[][]) {
  int n = arr.length;
  int temp = 0;
  int []myAge = new int[n];
  for (int i = 0; i < n; i++)
  {
      myAge[i] = Integer.parseInt(arr[i][1]);
  }
  boolean sorted = false;
  while (!sorted){
      sorted = true;
      for(int i = 1; i < n; i++) {
            if(myAge[i-1] > myAge[i]) {
               temp = myAge[i-1];
               myAge[i-1] = myAge[i];
               myAge[i] = temp;
               sorted = false;
            }
      }
  }
  return myAge;
}
public static void main(String[] args) {

   Qwerty bs = new Qwerty();
   String arr [][] = {{"Ace","10"},
                     {"Ben","8"},
                     {"Cid","20"},
                     {"Dan","5"}, 
                     {"Eve","12"}};
   int myAge[] = bs.bubbleSort(arr);
   for(int i = 0; i < arr.length; i++) {
     System.out.println(arr[i][0]+ myAge[i]);
   }
}

Во-первых, когда вы сделали Integer.parseInt, вы делали это только для j, а не j-1, что означает что в первой итерации вы сравниваете 8 с 0 (что является значением по умолчанию для элемента массива int), когда вы выполняете if(myAge[j-1] > myAge[j]). Я сделал это более ясным, просто предварительно проанализировав массив в отдельном l oop.

Во-вторых, в вашей пузырьковой сортировке вы узнаете, что сортировка завершена, когда вы можете go через массив без каких-либо перестановок. Это то, что я сделал с логическим значением sorted.

В-третьих, в вашем основном методе, когда вы просто делаете bs.bubbleSort(arr), ничего не произойдет, потому что метод возвращает void. Итак, я изменил метод, чтобы он возвращал массив int, и сохранил его в переменной myAge в методе main.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Увы, после прочтения вашего комментария я вижу, что вы также хотите, чтобы имена соответствовали каждому числу, мой плохой. Вот новый код, и я объясню, что я изменил.

public class Qwerty{
  static String[][] bubbleSort(String arr[][]) {
  int n = arr.length;
  int tempAge = 0;
  String tempName = "";
  int []myAge = new int[n];
  String myName[] = new String [n];
  for (int i = 0; i < n; i++)
  {
      myAge[i] = Integer.parseInt(arr[i][1]);
      myName[i] = arr[i][0];
  }
  boolean sorted = false;
  while (!sorted){
      sorted = true;
      for(int i = 1; i < n; i++) {
            if(myAge[i-1] > myAge[i]) {
               tempAge = myAge[i-1];
               myAge[i-1] = myAge[i];
               myAge[i] = tempAge;
               tempName = myName[i-1];
               myName[i-1] = myName[i];
               myName[i] = tempName;
               sorted = false;
            }
      }
  }
  for (int i = 0; i < arr.length; i++)
  {
      arr[i][0] = myName[i];
      arr[i][1] = Integer.toString(myAge[i]);
  }
  return arr;
}
public static void main(String[] args) {

   Qwerty bs = new Qwerty();
   String arr [][] = {{"Ace","10"},
                     {"Ben","8"},
                     {"Cid","20"},
                     {"Dan","5"}, 
                     {"Eve","12"}};
   arr = bs.bubbleSort(arr);
   for(int i = 0; i < arr.length; i++) {
     System.out.println(arr[i][0]+ arr[i][1]);
   }
}

Я заставил метод bubbleSort возвращать отсортированный String [] [] вместо простого массива int, как раньше. Я создал отдельный массив для имен, который является myName массивом. Это делается для того, чтобы в пузырьковой сортировке всякий раз, когда происходил обмен между двумя возрастами, имена также менялись местами с использованием переменной tempName. После того, как все перестановки сделаны в массивы myName и myAge, я использую al oop, чтобы поместить их обратно в строковый массив [] [], а затем вернуть его.

Извините, мне следовало бы более внимательно прочитать ваш вопрос. Спасибо.

...