2015-12-06 138 views
0

我正在爲大學實施Insertionsort。我的代碼在理論上是有效的,但我的for循環只執行一次,而不是books.size()(它是5,我已經測試過)。我用數字5試了一下,但它不起作用,我有點絕望,因爲我似乎無法找到錯誤。For循環只執行一次?

這裏是我的代碼:

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); 
     } 
    } 

圖書級的的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; 
     } 
    } 
} 

難道我只是瞎了嗎?

+5

內心的'返回;'似乎可疑...... –

+1

我與@Sparta傢伙! –

+0

我想你檢查了比較函數在第一次迭代中返回的值是否大於零? – Raven

回答

0

您需要交換返回換行並修復邏輯以避免兩次添加書籍。可能有比這更優雅的方式,但它應該工作:

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); 
     } 
    } 
+0

現在工作正常,謝謝:)唯一的問題是,我仍然有一個問題,因爲它似乎我的'compareTo',因爲它的輸出是: Eins,Abraham,1. Auflage Eins,Bebraham,2. Auflage Zwei,Bebraham,2. Auflage Eins,Bebraham,3. Auflage Drei,Zebraham,3. Auflage 這是正確的,但對於第四項._。 – Valentin

+0

我想這是因爲你在迭代時修改了集合:由於訂單被移動,但是你一次只檢查一個索引,所以你可能無法比較足夠的對來正確排序。相反(也許這是真正的答案),你應該實現一個比較器(使用你的compareTo方法)並使用Collections.sort(),總體來說總體來說更簡單。 – swilson

+0

http://stackoverflow.com/questions/2839137/how-to-use-comparator-in-java-to-sort – swilson

0

好吧,我發現瞭如何解決這個問題,只是如果有人有同樣的問題(不認爲會發生,但它是一個我希望的好習慣)。

正如@Klitos Kyriacou指出的那樣,我在思考Insertionsorting的過程時有一個轉折。

解決辦法是改變環如下所示:

 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; 
      } 
     } 
    } 
}