Понимание логики кода в алфавитной сортировке - PullRequest
1 голос
/ 19 апреля 2019

У меня проблемы с пониманием того, как этот код сортирует города в алфавитном порядке. Я не понимаю логику в циклах if, и если кто-то объяснит мне, как работает «переключение» и почему первый и последний операторы блока if одинаковы?

Я пытался решить эту проблему самостоятельно, но моя логика была ошибочной, и я не понимаю, как эта логика работает.

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

Спасибо.

import java.util.Scanner;
public class Cars {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);

        System.out.println("Enter first city");
        String first = sc.nextLine();
        System.out.println("Enter second city");
        String second = sc.nextLine();
        System.out.println("Enter third city");
        String third = sc.nextLine();


        String temp = "";
        if(first.compareTo(second)>0) {
            temp = second;
            second = first;
            first = temp;
        }
        if(second.compareTo(third) > 0) {
            temp = third;
            third = second;
            second = temp;
        }
        if(first.compareTo(second) > 0) {
            temp = second;
            second = first;
            first = temp;
        }
        System.out.println("alphabetical order" + " " + first + " " + second +" " + third);
    }
}

Ответы [ 4 ]

1 голос
/ 19 апреля 2019

Как работает переключение?

temp = second; // Store the second element in a temporary variable
second = first; // Replace the second element by the first
first = temp; // Replace the first element by the temporary (the old second)

Эта часть кода просто поменяет местами два элемента.

Почему третий блок такой же, как первый?

Поскольку обмен может уже происходить в первых двух блоках

Пример может говорить лучше, чем теория, давайте сделаем так:

first = "b";
second = "c";
third = "a";

Первый блок обмена будет сравнивать first с second, они уже в хорошем порядке, поэтому обмен не выполняется:

first = "b";
second = "c";
third = "a";

Второй блок будет сравнивать second с third, они расположены в неправильном порядке, поэтому мы меняем их местами, в результате:

first = "b";
second = "a";
third = "c";

Вот точка: Теперь нам нужно сравнить то, что не сравнивалось с первым первым, с исходным третьим, поэтому фактическое первое с фактической секундой (похоже на первое блок), в результате чего:

first = "a";
second = "b";
third = "c";

Но что, если второе и третье не поменялись местами? В этом случае мы бы знали, что второе и первое правильно упорядочены (из-за первого блока), и что второе и третье также упорядочены правильно (из-за второго блока), поэтому мы знаем, что все данные отсортированы, и мы не не волнует третий блок, он не будет введен.

1 голос
/ 19 апреля 2019

В первых строках должны быть указаны названия городов из стандартного ввода:

Scanner sc = new Scanner(System.in);

System.out.println("Enter first city");
String first = sc.nextLine();
System.out.println("Enter second city");`
String second = sc.nextLine();
System.out.println("Enter third city");
String third = sc.nextLine();

Затем вы сравниваете и меняете позиции.Прочитайте javadoc метода String.compareTo (String anotherString).

@ вернуть значение {@code 0}, если строка аргумента равна этой строке;значение меньше {@code 0}, если эта строка лексикографически меньше строкового аргумента;и значение больше, чем {@code 0}, если эта строка лексикографически больше, чем строковый аргумент

Таким образом, мы сравниваем первое имя со вторым.Если второе название города лексикографически больше первого, мы используем переменную temp, чтобы поменять местами города

String temp = "";
if(first.compareTo(second)>0) {
    temp = second;
    second = first;
    first = temp;
}

Теперь мы знаем частичный порядок.Нам нужно сравнить второе с третьим, а затем снова первое с третьим, чтобы убедиться, что все 3 названия городов отсортированы лексикографически

if(second.compareTo(third) > 0) {
    temp = third;
    third = second;
    second = temp;
}
if(first.compareTo(second) > 0) {
    temp = second;
    second = first;
    first = temp;
 }

По сути, это пузырьковая сортировка для размера списка = 3 https://en.wikipedia.org/wiki/Bubble_sort

1 голос
/ 19 апреля 2019

Я объясню, что делает этот код:

if(first.compareTo(second)>0) {
    temp = second;
    second = first;
    first = temp;
}
if(second.compareTo(third) > 0) {
    temp = third;
    third = second;
    second = temp;
}
if(first.compareTo(second) > 0) {
    temp = second;
    second = first;
    first = temp;
}

Допустим, first содержит C, second содержит B и third содержит A.

Сначала first, second и third не отсортированы.

(сначала if) Если город в first должен идти после города в second, поменяйте их местами. Как мы их поменяем? Сначала мы копируем секунду во временную переменную temp, помещаем все, что находится в first, в second, а затем помещаем все, что в temp, в first. Это проще визуализировать, если вы рассматриваете переменные как блоки, а значения, которые вы заменяете как шары.

После первого запуска, если first содержит B, second содержит C и third содержит A

(секунда if) Если second следует после third, поменяйте их местами. Теперь first содержит B, second содержит A и third содержит C.

Теперь вы должны заметить, что запустив первые два оператора if, мы нашли, что должно быть в third. Теперь нам просто нужно выяснить, отсортированы ли first и second, что делается в третьем операторе if.

Почему третий оператор if делает то же самое, что и первый оператор if?

У них одинаковый код, но третий if запускается после первого и второго if, если к этому времени first и second будут иметь разные значения.

0 голосов
/ 19 апреля 2019

Этот код является пузырьковой сортировкой для 3 элементов.

Обычно он использует циклы, но если у вас есть только 3 элемента (любое постоянное количество элементов), вы можете избавиться от них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...