我在理解此代码如何将城市按字母顺序排序时遇到问题。我不理解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);
}
}
答案 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
包含C
,second
包含B
,而third
包含A
。
首先,first
,second
和third
未排序。
(第一个if
)如果first
中的城市应该在second
中的城市之后,请交换它们。我们如何交换它们?我们首先将其复制到一个临时变量temp
中,将first
中的任何内容放入second
中,然后将temp
中的任何内容放入first
中。如果您将变量视为盒子,而将要交换的值视为球形,则更容易可视化。
运行第一个if后,first
包含B
,second
包含C
,而third
包含A
(第二个if
)如果second
应该在third
之后,请交换它们。现在,first
包含B
,second
包含A
,而third
包含C
。
现在您应该注意到,通过运行前两个if语句,我们已经发现third
中应该包含的内容。现在,我们只需要确定first
和second
是否已排序,可以在第三条if语句中完成。
为什么第三个if语句与第一个if语句做相同的事情?
它们具有相同的代码,但是如果first
和second
的值不同,则第三个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";
第一个交换块将first
与second
进行比较,它们已经处于良好的顺序,因此不进行交换:
first = "b";
second = "c";
third = "a";
第二个块将比较second
和third
,它们的顺序错误,因此我们将它们交换,结果是:
first = "b";
second = "a";
third = "c";
这是要点: :我们现在需要将未比较的第一项与最初的第三项进行比较,因此将实际的第一项与实际的第二项进行比较(看起来像第一块),结果为:
first = "a";
second = "b";
third = "c";
但是如果没有交换第二和第三怎么办?在这种情况下,我们会知道第二个和第一个被正确排序(由于第一个块),第二个和第三个也被正确排序(由于第二个块),因此我们知道整个数据都已排序,而我们不在乎第三个区块,不会输入。
答案 3 :(得分:0)
该代码是3个元素的冒泡排序。
通常它使用循环,但是如果您只有3个元素(任何恒定数量的元素),您可以摆脱它们。