【问题标题】:How do i alphabetize this ArrayList without using the Collections.sort method?如何在不使用 Collections.sort 方法的情况下按字母顺序排列这个 ArrayList?
【发布时间】:2020-03-19 05:33:47
【问题描述】:

这是我为了好玩而做的一项学校作业。在这个作业中,我应该在 ArrayList 中插入单词,然后手动停止 ArrayList,然后程序应该按字母顺序排列它。但问题是,每个教程都告诉我使用 Collections.sort 方法之类的,但我们还没有在课堂上学习过,所以我们显然不打算使用它。此外,这项任务的挑战是对 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);
    }
}

【问题讨论】:

  • 我建议在谷歌上搜索“冒泡排序”这个短语。这是更简单的排序技术之一。在搜索中添加“java 示例”可能会给您一个示例。
  • 您可以使用排序算法而不是使用方法。这些包括遍历 ArrayList 并根据您设置的参数(例如最小到最大或按字母顺序排列)比较其中的对象(基本上是一样的,只有一个是数字,另一个是字符串)。一些更简单的方法包括冒泡排序、插入排序和选择排序。
  • 我尝试使用 temp 进行冒泡排序,但它给了我一个错误,说左手必须是一个变量。我不知道如何解决它。
  • 这意味着赋值运算符左边的任何东西 = 必须是一个变量。使用words.get(j) 是一个访问器并返回一个值。这样做时,您实际上无法改变索引 j 处的值,因此使用 = 将不起作用。您可以使用words.set(j, temp) 设置索引 j 处的值。 .set 是一个 mutator 方法,允许您更改索引 j 处的值。希望这会有所帮助!
  • 我试过了,编辑已发布。但问题是,words.set(i,j);不工作。你知道为什么吗?

标签: java string arraylist swap


【解决方案1】:

看起来我无法在评论中很好地解释自己,所以我会让我的代码为我说话。

实现冒泡排序的循环应该如下:

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) {

如果要升序,请将&lt; 0更改为&gt; 0

我试图在我的comment 中解释您没有在循环内为局部变量temp 赋值。

【讨论】:

  • 谢谢,我对 i 和 j 的事情感到困惑,但现在更有意义了
  • 我还真的需要 >0 来按字母顺序对所有内容进行排序。也非常感谢你
【解决方案2】:

让我们看看你写的代码:

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赋值,所以这段代码实际上会用null值“破坏”你的列表,
  3. 你有两行写入同一个索引,所以第一行 words.set(i, temp) 基本上“什么都不做”,即使它做了正确的事情。

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

  1. 从一个列表 (a,b) 开始,希望交换元素 0 和 1,以及一些临时变量
  2. set 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);
   }
  }
}

【讨论】:

  • 其实这行代码没有编译通过:words.set(i,j);
  • 感谢您对我的包容。在您概述了每一行之后,现在这一切都变得更有意义了。现在可以了:)
猜你喜欢
  • 2017-05-07
  • 1970-01-01
  • 2016-04-28
  • 2011-01-30
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2012-05-05
相关资源
最近更新 更多