for循环只执行一次?
For-loop is executed only once?
我正在为大学实施插入排序。我的代码在理论上是有效的,但我的 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 换成 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);
}
}
好吧,我找到了解决方法,如果有人遇到同样的问题(不要认为会发生这种情况,但我希望这是一个好习惯)。
正如@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;
}
}
}
}
我正在为大学实施插入排序。我的代码在理论上是有效的,但我的 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 换成 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);
}
}
好吧,我找到了解决方法,如果有人遇到同样的问题(不要认为会发生这种情况,但我希望这是一个好习惯)。
正如@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;
}
}
}
}