【问题标题】:How can I sort an ArrayList with Insertion Sort?如何使用插入排序对 ArrayList 进行排序?
【发布时间】:2019-05-16 18:19:53
【问题描述】:

我的老师要求我们导入一个包含 2043 个 Euromillions 密钥的文本文件,格式如下:

1987 45 12 14 39 43 48 8 10
1981 23 12 18 22 29 45 10 12
1980 6 29 31 45 46 50 4 8
2018 19 2 4 16 19 50 6 12
1986 23 1 10 33 38 42 7 12
1986 40 18 23 26 27 36 7 12
...

我已将文件导入到 ArrayList,我需要使用插入排序按日期对键进行排序(第一个数字是年份,接下来是星期),格式如下:

{1987/45} |12|14|39|43|48| |8|10|
{1981/23} |12|18|22|29|45| |10|12|
...

关于如何按日期对键进行排序并将它们存储在 Array 或 ArrayList 中的任何想法?

我已将文件导入 ArrayList,但如果这是个好主意,我尝试对 ArrayList 进行排序但没有成功。

private static ArrayList<String> ImportedKeys = new ArrayList<String>();

public static void importarChaves() {

String linha;

        int year,week,ball1,ball2,ball3,ball4,ball5,star1,star2;

        File file=new File("Documento/euromilhoes.txt");
        Scanner leitor=null;
        try {
            leitor = new Scanner(file);
        } catch (FileNotFoundException e) {
            System.out.println("File not found");
            e.printStackTrace();
        }
        int count = 0;
        while(leitor.hasNextLine()){

            linha=leitor.nextLine();
            // System.out.println(linha);

            Scanner lerString=new Scanner(linha);

            year=lerString.nextInt();
            week=lerString.nextInt();
            ball1=lerString.nextInt();
            ball2=lerString.nextInt();
            ball3=lerString.nextInt();
            ball4=lerString.nextInt();
            ball5=lerString.nextInt();
            star1=lerString.nextInt();
            star2=lerString.nextInt();

            ImportedKeys.add(linha);

            count++;
            lerString.close();


        }

【问题讨论】:

  • 我可以告诉你你是一个开始编码的学生。恭喜!尝试将您的挑战分解为可管理的部分,并编写处理每个部分的不同函数。此外,请多考虑选择有意义的变量名称 - 它会让您的代码对您和其他人都更具可读性
  • 这不是一个“为我编写代码”的网站,您至少需要尝试一下您需要帮助的内容。请阅读How to Ask,对于未来的问题,您需要提供minimal reproducible example
  • @TheChubbyPanda 从来没有要求任何人为我编码,我只问是否有人知道如何使用里面的键对 ArrayList 进行排序,这不是这个网站帮助和获取的重点吗?你的问题得到解答了吗?
  • 目前,您的问题不包含与排序有关的代码。您所做的只是将数字加载到 ArrayList 中。这个网站不解释算法,它主要帮助人们调试他们的代码。由于您没有提供要调试的排序代码,我假设您希望有人通过编码向您“解释”它。

标签: java arraylist text-files insertion-sort


【解决方案1】:

一些事情。首先,插入排序是一种非常特殊的排序类型,您在插入时进行排序。也就是说,在任何给定时间,您的数组都会被排序。当您添加第 400 个元素时,它会插入到正确的位置。

这就是我要做的。首先,我将从一个更短的示例文件开始,因此您的输出是合理的。 10 行。

我将创建一个表示一行的对象,但不是作为字符串,而是作为具有各个部分的对象。请记住,您不能进行字符串比较,因为第 6 周将在第 11 周之后排序。因此您的对象可能包含数字年份、数字周,然后是其余的内容。

然后我会这样做:我会编写一个输入方法来读取文件并生成一个(未排序的)新对象数组。通过读入你的文件并打印出结果来测试它。这将验证您是否正确阅读。

那我就明白几个概念了。

  1. 空列表已排序。
  2. 有 1 项的列表已排序。
  3. 如果列表已排序,您可以对其进行二分搜索。

什么是二分查找?

class MyArray extends ArrayList<MyObject> {
    public int insertionPoint(int year, int month {
         return insertionPoint(year, month, 0, length());
    }

    private int insertionPoint(int year, int month, int low, int high) {
        if (low >= high) {
             return low;
        }
        int mid = (low + high) / 2;
        MyObject obj = get(mid);
        if (obj.year < year || (obj.year == year && obj.month < month)) {
            return insertionPoint(year, month, low, mid);
        }
        return insertionPoint(year, month, mid+1, high);
    }
}

这是一个二分搜索。这是一个非常非常重要的概念。您的列表已排序,这意味着您可以通过将列表分成两半来快速找到现有对象(或新对象应该去哪里)。假设有 2000 个项目。您检查第 1000 个项目。如果您正在搜索之前的位置(请参阅 if 语句),那么。您只需要查看列表的前半部分。否则你看下半场。

一旦有了插入点,您就可以在该点将新项目插入列表中。那是一个插入列表。

注意:我是手动编写代码,而不是在 IDE 中。它可能并不完美。

总而言之,当你完成后,这应该少于 100 行代码。这应该足以定义您的新对象并定义一个知道如何进行插入的排序列表,以及测试它的代码。

但是插入排序的技巧:

  1. 在进行时保持数组排序
  2. 了解二分搜索
  3. 您需要了解递归。我上面的第二种方法是高度递归的。它会将列表分解成越来越小的部分,直到确定下一个项目应该去哪里。

那么你该怎么做:

  1. 创建您的 MyObject 对象(或您所称的任何对象)。
  2. int location = myList.insertLocation(object.year, object.week)
  3. 添加(位置,对象)

【讨论】:

  • 非常感谢 Joseph Larson 先生,我一定会听从您的建议,并尝试用您的方法解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2019-08-26
  • 2016-05-05
  • 1970-01-01
  • 2016-08-28
  • 2011-04-11
相关资源
最近更新 更多