了解字母排序中的代码逻辑

时间:2019-04-19 07:53:52

标签: java string eclipse if-statement

我在理解此代码如何将城市按字母顺序排序时遇到问题。我不理解if循环中的逻辑,是否有人向我解释“切换”的工作原理,以及为什么第一个和最后一个if块语句相同?

我尝试自己尝试解决此问题,但我的逻辑有缺陷,我不知道此逻辑如何工作。

我知道我可以通过使用数组和排序来简化此过程,但是我是Java的初学者,但仍在尝试了解if语句和字符串。

谢谢。

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 个答案:

答案 0 :(得分:1)

第一行应该从标准输入中读取城市名称:

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.compareTo(String anotherString)方法的Javadoc。

  

@如果参数字符串等于此字符串,则返回值{@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 :(得分:1)

我将解释这段代码的作用:

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包含Csecond包含B,而third包含A

首先,firstsecondthird未排序。

(第一个if)如果first中的城市应该在second中的城市之后,请交换它们。我们如何交换它们?我们首先将其复制到一个临时变量temp中,将first中的任何内容放入second中,然后将temp中的任何内容放入first中。如果您将变量视为盒子,而将要交换的值视为球形,则更容易可视化。

运行第一个if后,first包含Bsecond包含C,而third包含A

(第二个if)如果second应该在third之后,请交换它们。现在,first包含Bsecond包含A,而third包含C

现在您应该注意到,通过运行前两个if语句,我们已经发现third中应该包含的内容。现在,我们只需要确定firstsecond是否已排序,可以在第三条if语句中完成。

为什么第三个if语句与第一个if语句做相同的事情?

它们具有相同的代码,但是如果firstsecond的值不同,则第三个if在第一个和第二个之后运行。

答案 2 :(得分:1)

切换如何工作?

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";

第一个交换块将firstsecond进行比较,它们已经处于良好的顺序,因此不进行交换:

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

第二个块将比较secondthird,它们的顺序错误,因此我们将它们交换,结果是:

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

这是要点: :我们现在需要将未比较的第一项与最初的第三项进行比较,因此将实际的第一项与实际的第二项进行比较(看起来像第一块),结果为:

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

但是如果没有交换第二和第三怎么办?在这种情况下,我们会知道第二个和第一个被正确排序(由于第一个块),第二个和第三个也被正确排序(由于第二个块),因此我们知道整个数据都已排序,而我们不在乎第三个区块,不会输入。

答案 3 :(得分:0)

该代码是3个元素的冒泡排序。

通常它使用循环,但是如果您只有3个元素(任何恒定数量的元素),您可以摆脱它们。