2015-12-06 2 views
0

Я внедряю Insertionsort для университета. Мой код работает теоретически, но мой цикл for выполняется только один раз вместо books.size() (который равен 5, я тестировал это). Я попробовал это, используя номер 5, но это не сработает, и я отчасти отчаялся, потому что я не могу найти ошибку.For-loop выполняется только один раз?

Вот мой код:

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

Am I просто слепым?

+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; 
      } 
     } 
    } 
} 
Смежные вопросы