如何在不使用 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]

这里有几个问题:

  1. 您可能想要反转该条件,因为您希望 (z,a) 变为 (a,z),而不是相反。
  2. 你永远不会为 temp 赋值,所以这段代码实际上 "corrupt" 你的列表 null 值,
  3. 你有两行写入同一个索引,所以第一行 words.set(i, temp) 基本上是 "does nothing",即使它确实做了正确的事情。

让我们解决这个问题:交换任何数组或列表中的两个元素需要第三个临时占位符。您将要交换的两个元素之一放入临时占位符,然后用另一个元素的值覆盖该元素,然后用临时占位符的值覆盖元素:

  1. 从列表 (a,b) 开始,希望交换元素 0 和 1,以及一些临时变量
  2. 设置 temp = list[0],所以我们现在有 list=(a,b), temp=a.
  3. 用列表[1]覆盖列表[0],所以我们现在有list=(b,b), temp=a
  4. 用你的临时值覆盖列表[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);
   }
  }
}