【问题标题】:For-loop is executed only once?for循环只执行一次?
【发布时间】:2024-05-04 16:10:04
【问题描述】:

我正在为大学实施插入排序。我的代码在理论上有效,但我的 for 循环只执行一次,而不是 books.size() (这是 5,我已经测试过了)。我尝试使用数字 5,但它不起作用,我有点绝望,因为我似乎找不到错误。

这是我的代码:

    static void sort(LinkedList<Book> books)
    {
        int i;
        for ( i = 0; i < books.size(); i++)
        {
            Book temp = books.get(i);
            books.remove(i);
            for (int j = 0; j < books.size(); j++) {
                if (books.get(j).compareTo(temp) > 0) {
                    books.add(j, temp);
                    return;
                }
            }
            books.add(temp);
        }
    }

Book-Class 的 compareTo 函数如下所示:

public int compareTo(Book other)
{
    int iAutor = autor.compareTo(other.getAutor());

    if (iAutor != 0)
        return iAutor;
    else
    {
        int iTitel = titel.compareTo(other.getTitel());

        if (iTitel != 0)
            return iTitel;
        else
        {
            if (this.auflage < other.getAuflage())
                return -1;
            else if (this.auflage > other.getAuflage())
                return 1;
            else
                return 0;
        }
    }
}

我只是瞎了吗?

【问题讨论】:

  • 那个内部return; 似乎很可疑......
  • 我和那个@Sparta 家伙在一起!
  • 我猜你检查了比较函数在第一次迭代中返回的值是否大于零?
  • @Sparta 好吧,当您编码累了时会发生这种情况.__。你是对的,就是这样。但是如果我用break 交换它,它会添加每个条目两次。我可以在不将其外包给单独的 insert 函数的情况下做些什么吗?
  • @Valentin 向我们解释您想要实现的目标。我们甚至可能会向您建议一些逻辑见解..

标签: java for-loop insertion-sort


【解决方案1】:

您需要将 return 换成 break 并修复逻辑以避免两次添加书籍。可能有比这更优雅的方法,但它应该可以工作:

    int i;
    for ( i = 0; i < books.size(); i++)
    {
        Book temp = books.get(i);
        books.remove(i);
        bool added = false;
        for (int j = 0; j < books.size(); j++) {
            if (books.get(j).compareTo(temp) > 0) {
                books.add(j, temp);
                added = true;
                break;
            }
        }
        if (!added) {
            books.add(temp);
        }
    }

【讨论】:

  • 现在可以正常工作了,谢谢 :) 唯一的问题是我的compareTo 似乎仍然有问题,因为输出是:Eins, Abraham, 1. Auflage Eins, Bebraham, 2. Auflage Zwei, Bebraham, 2. Auflage Eins, Bebraham, 3. Auflage Drei, Zebraham, 3. Auflage 这是正确的,但对于第四个条目._.
  • 我猜这是因为您在迭代时正在修改集合:由于订单被移动但您一次检查每个索引,您可能无法比较足够多的对来正确排序。相反(也许这是真正的答案)你应该实现一个 Comparator (使用你的 compareTo 方法)并使用 Collections.sort(),这总体上更容易。
【解决方案2】:

好吧,我找到了解决方法,只要有人遇到同样的问题(不要认为会发生这种情况,但我希望这是一个好习惯)。

正如@Klitos Kyriacou 指出的那样,我对插入排序过程的想法有所不同。

解决方案是改变以下循环:

     static void sort(LinkedList<Book> books) {

    Book temp;
    for (int counter = 0; counter < books.size(); counter++) {
        temp = books.get(counter);

        for (int position = 0; position < counter; position++)
        {
            if (temp.compareTo(books.get(position)) < 0)
            {
                books.remove(counter);
                books.add(position, temp);
                break;
            }
        }
    }
}

【讨论】:

    最近更新 更多