如何在不使用 Collections.sort 方法的情况下按字母顺序排列此 ArrayList?
How do i alphabetize this ArrayList without using the Collections.sort method?
这是我为了好玩而做的一项学校作业。在此作业中,我应该将单词插入 ArrayList,然后手动停止 ArrayList,然后程序应该按字母顺序排列它。但问题是,每个教程都告诉我使用 Collections.sort 方法或其他东西,但我们在 class 中还没有学到,所以我们显然不打算使用它。此外,此作业的挑战是对 1 ArrayList 中的所有内容进行排序,而不是从 ArrayList 中取出单词,按字母顺序排列单词,然后将按字母顺序排列的单词插入第二个 ArrayList。有人可以帮我解决这个问题吗?我没有在字母顺序部分写任何东西,因为我不知道从哪里开始。谢谢。
import java.util.*;
public class LexiHeaven {
public static void main(String[] args) {
ArrayList<String> words = new ArrayList<String>();
Scanner sc = new Scanner(System.in);
System.out.println("Please enter a word into the Array (enter stop if you want to stop):");
String w = sc.nextLine();
while (!w.equals("stop")) {
words.add(w);
System.out.println("Please enter a word into the Array (enter stop if you want to stop):");
w = sc.nextLine();
}
System.out.println(words);
System.out.println("Alphabetize the ArrayList:");
String temp = "";
for (int i = 0; i < words.size(); i++) {
for (int j = i + 1; j < words.size(); j++) {
if (words.get(i).compareTo(words.get(j)) > 0) {
temp = words.get(i);
words.set(i, words.get(j));
words.set(j, temp);
}
}
}
System.out.println(words);
}
}
看来我无法在评论中很好地解释自己,所以我会让我的代码为我说话。
实现冒泡排序的循环应如下所示:
String temp;
for (int i = 0; i < words.size(); i++) {
for (int j = i + 1; j < words.size(); j++) {
if (words.get(i).compareTo(words.get(j)) < 0) {
temp = words.get(i);
words.set(i, words.get(j));
words.set(j, temp);
}
}
}
请注意,由于您正在进行比较,因此这会按 降序 顺序对列表进行排序,即
if (words.get(i).compareTo(words.get(j)) < 0) {
如果您想要升序,请将 < 0
更改为 > 0
我试图在我的 中解释,您没有在循环内为局部变量 temp
赋值。
让我们看看您编写的代码:
String temp;
for (int i = 0; i < words.size(); i++) {
for (int j = i + 1; j < words.size(); j++) {
if (words.get(i).compareTo(words.get(j)) < 0) {
words.set(i, temp);
words.set(i,j);
words.set(j, temp);
}
}
}
不过,这实际上并没有交换任何东西。让我们用代码解释来描述那个内循环:
if words[i] is alphabetically "lower" than words[j], do:
- write the content of "temp" into words[i]
- write the number "j" into words[i]
- write the content of "temp" into words[j]
这里有几个问题:
- 您可能想要反转该条件,因为您希望 (z,a) 变为 (a,z),而不是相反。
- 你永远不会为
temp
赋值,所以这段代码实际上 "corrupt" 你的列表 null
值,
- 你有两行写入同一个索引,所以第一行
words.set(i, temp)
基本上是 "does nothing",即使它确实做了正确的事情。
让我们解决这个问题:交换任何数组或列表中的两个元素需要第三个临时占位符。您将要交换的两个元素之一放入临时占位符,然后用另一个元素的值覆盖该元素,然后用临时占位符的值覆盖元素:
- 从列表 (a,b) 开始,希望交换元素 0 和 1,以及一些临时变量
- 设置 temp = list[0],所以我们现在有
list=(a,b), temp=a
.
- 用列表[1]覆盖列表[0],所以我们现在有
list=(b,b), temp=a
- 用你的临时值覆盖列表[1],所以我们现在有
list=(b,a), temp=a
您正在使用 temp
变量和 ArrayList 代码,因此:
String temp;
for(...) {
for(...) {
if (...) {
temp = words.get(i);
words.set(i, words.get(j));
words.set(j, temp);
}
}
}
这是我为了好玩而做的一项学校作业。在此作业中,我应该将单词插入 ArrayList,然后手动停止 ArrayList,然后程序应该按字母顺序排列它。但问题是,每个教程都告诉我使用 Collections.sort 方法或其他东西,但我们在 class 中还没有学到,所以我们显然不打算使用它。此外,此作业的挑战是对 1 ArrayList 中的所有内容进行排序,而不是从 ArrayList 中取出单词,按字母顺序排列单词,然后将按字母顺序排列的单词插入第二个 ArrayList。有人可以帮我解决这个问题吗?我没有在字母顺序部分写任何东西,因为我不知道从哪里开始。谢谢。
import java.util.*;
public class LexiHeaven {
public static void main(String[] args) {
ArrayList<String> words = new ArrayList<String>();
Scanner sc = new Scanner(System.in);
System.out.println("Please enter a word into the Array (enter stop if you want to stop):");
String w = sc.nextLine();
while (!w.equals("stop")) {
words.add(w);
System.out.println("Please enter a word into the Array (enter stop if you want to stop):");
w = sc.nextLine();
}
System.out.println(words);
System.out.println("Alphabetize the ArrayList:");
String temp = "";
for (int i = 0; i < words.size(); i++) {
for (int j = i + 1; j < words.size(); j++) {
if (words.get(i).compareTo(words.get(j)) > 0) {
temp = words.get(i);
words.set(i, words.get(j));
words.set(j, temp);
}
}
}
System.out.println(words);
}
}
看来我无法在评论中很好地解释自己,所以我会让我的代码为我说话。
实现冒泡排序的循环应如下所示:
String temp;
for (int i = 0; i < words.size(); i++) {
for (int j = i + 1; j < words.size(); j++) {
if (words.get(i).compareTo(words.get(j)) < 0) {
temp = words.get(i);
words.set(i, words.get(j));
words.set(j, temp);
}
}
}
请注意,由于您正在进行比较,因此这会按 降序 顺序对列表进行排序,即
if (words.get(i).compareTo(words.get(j)) < 0) {
如果您想要升序,请将 < 0
更改为 > 0
我试图在我的 temp
赋值。
让我们看看您编写的代码:
String temp;
for (int i = 0; i < words.size(); i++) {
for (int j = i + 1; j < words.size(); j++) {
if (words.get(i).compareTo(words.get(j)) < 0) {
words.set(i, temp);
words.set(i,j);
words.set(j, temp);
}
}
}
不过,这实际上并没有交换任何东西。让我们用代码解释来描述那个内循环:
if words[i] is alphabetically "lower" than words[j], do:
- write the content of "temp" into words[i]
- write the number "j" into words[i]
- write the content of "temp" into words[j]
这里有几个问题:
- 您可能想要反转该条件,因为您希望 (z,a) 变为 (a,z),而不是相反。
- 你永远不会为
temp
赋值,所以这段代码实际上 "corrupt" 你的列表null
值, - 你有两行写入同一个索引,所以第一行
words.set(i, temp)
基本上是 "does nothing",即使它确实做了正确的事情。
让我们解决这个问题:交换任何数组或列表中的两个元素需要第三个临时占位符。您将要交换的两个元素之一放入临时占位符,然后用另一个元素的值覆盖该元素,然后用临时占位符的值覆盖元素:
- 从列表 (a,b) 开始,希望交换元素 0 和 1,以及一些临时变量
- 设置 temp = list[0],所以我们现在有
list=(a,b), temp=a
. - 用列表[1]覆盖列表[0],所以我们现在有
list=(b,b), temp=a
- 用你的临时值覆盖列表[1],所以我们现在有
list=(b,a), temp=a
您正在使用 temp
变量和 ArrayList 代码,因此:
String temp;
for(...) {
for(...) {
if (...) {
temp = words.get(i);
words.set(i, words.get(j));
words.set(j, temp);
}
}
}