Вопрос

Привет, я знаю, как реализовать простую пузырьковую сортировку для одномерного массива.Но вот с двухмерностью и многомерностью у меня возникают проблемы.

До сих пор я использовал это для сортировки одномерных массивов, работает как шарм.Но в основном с целыми числами, а не строками:

boolean sort;

do{
    sort = true;

    for (int i = 0; i < testarray.length - 1; i++){
        if(testarray[i] > testarray[i+1]){
            temp = testarray[i];
            testarray[i] = testarray[i+1];
            testarray[i+1] = temp;           
            sort = false;
        }
    }

}while(!sort);

    // Descending Output
    // for (int k = testarray.length - 1; k >= 0 ; k--){

    // Ascending Output
    for (int k = 0; k < testarray.length ; k++){
        System.out.print(testarray[k] + ", ");
    }

Предполагая, что у меня есть:

Номер клиента, Имя, Фамилия, Адрес

String customers[][] = {{"123", "John", "Doe", "Somewhere"}, {"007", "James", "Bond", "MI5"}, {"1337", "Lolcat", "Izgud", "Saturn"}}

Теперь я хочу выбрать сортировку, что сортировать после:номер клиента, имя, фамилия или адрес.И после этого я хочу вывести его по возрастанию или убыванию, в зависимости от того, чего я хочу.

Я просто понятия не имею, как это реализовать с помощью пузырьковой сортировки.Я хочу остаться в пузырьковой сортировке, без другого алгоритма сортировки, я хочу узнать, как пузырьковая сортировка работает в такой ситуации.

Для восхождения и спуска моя идея была бы такой:Я мог бы сделать цикл if.Например if (asc == 1) then output ascending, else output descending.Затем запрос по возрастанию будет задан, например, через консоль.

Буду признателен за любую оказанную помощь.

Это было полезно?

Решение

Двумерный массив — это, по сути, одномерный массив, состоящий из массивов.

Просто используйте тот же код, что и у вас, только вместо целых чисел переместите внутренние массивы.

Чтобы узнать, является ли один массив «больше», чем другой, сравните строковые значения правильного члена массива (например, имени или фамилии...).Для этого вы можете использовать метод String CompareTo.

Последнее примечание:Пример, который вы привели, лучше, если внутренний массив на самом деле является объектом, содержащим информацию.Таким образом, вы можете иметь отдельные типы данных для всех полей вместо того, чтобы делать их строками.

например.:

  class Person
  {
       int customerNumber;
       String name;
       String surName;
       String address;
  };

РЕДАКТИРОВАТЬ:чтобы ответить на ваш вопрос:

измените свою программу следующим образом:

измените временное объявление:

 String [] temp;

и измените строку:

 if(testarray[i] > testarray[i+1])

в:

 if(testarray[i][1] > testarray[i+1][1])

чем это сработает и отсортирует по имени

р

Другие советы

В 2D-массиве тип содержащихся в нем объектов меняется с int или Integer к String[] (примечание:это массив строк).Это то, что вам нужно, чтобы изменить тип temp к.

Самое большое изменение будет в вашем сравнении.Вы не можете просто сравнить два массива строк, используя < – но ты уже знал это.Что вам нужно сделать, так это создать метод, который требует двух String[] аргументы и возвращает отрицательное, 0 или положительное число в зависимости от того, меньше ли первое, равное или больше второго.Затем вы можете сделать < / > сравнение результатов этого метода, чтобы установить порядок сортировки.

Если вы хотите иметь возможность использовать несколько разных критериев сортировки, вам нужно либо сделать функцию сравнения более универсальной, (например) передав другой параметр, чтобы указать ей, как работать, либо вам понадобится несколько разных функций сравнения. и используйте if или switch чтобы решить, какой из них использовать во время сортировки.

Что касается ручного сравнения двух массивов строк, основной метод:Сравните первые ключевые строки, используя String.compareTo().Если результат не 0, верните его.Если он равен 0, то первые ключи равны и нужно сравнивать следующие ключи.Если у вас закончились ключи и вы все еще имеете значение 0, ваши два элемента равны по своим ключам, и вы возвращаете 0.

Вы можете сохранить тот же алгоритм сортировки.Он по-прежнему не будет знать о 2D-массиве.Вам нужно придумать функцию сравнения, которая принимает два одномерных массива и определяет, какой из них больше.

Я предполагаю, что вы хотите, чтобы «123», «Джон», «Доу» и «где-то» были сгруппированы вместе.

Я предлагаю вам использовать объект, скажем

public object Person {
    private int id;
    private String name;
    private String surname;
    private String address;
}

добавление обычных геттеров и сеттеров.

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

Сигнатура метода сортировки должна выглядеть примерно так:

public Person[] bubbleSort(Person[] persons, Comparator comp)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top