Удаление и сортировка элементов в LinkedList - Java - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть структура данных LinkedList, которую я использую для хранения некоторых элементов. Этот вопрос является частью курса, который требует от меня использования стандартного java .utils LinkedList. Основной сценарий c заключается в том, чтобы иметь возможность добавлять книги и словари в LinkedList, а затем удалять их. Вопрос, на котором я застрял, требует сортировки LinkedList, чтобы все словари были в конце LinkedList, а книги - в начале.

Вот мой текущий код для сортировки элементов:

public static void moveDictionaries(Bookshelf b){
    int size = b.bookshelf.size();
    for(int i = 0; i<b.size(); i++) {
        Book temp = b.bookshelf.get(i);
        if(temp instanceof Dictionary){
            b.bookshelf.remove(temp);
            b.bookshelf.add(size - 1, temp);
        }
    }
}

Словарь - это подкласс Book. Что я делаю, это использую для l oop, чтобы перебрать список. Я проверяю, является ли текущий элемент словарём, и если да, то добавляю его в конец LinkedList, используя размер в качестве позиции для добавления. Затем я удаляю элемент из LinkedList. Вот мой класс Книжной полки:

public class Bookshelf {

    List<Book> bookshelf = new LinkedList<Book>();

    public int size(){
        return bookshelf.size();
    }

    public void addBookOnLeftSide(Book b){
        bookshelf.add(b);
    }

    public void addBook(int i, Book b){
        bookshelf.add(i, b);
    }

    public Book remove(int i){
        Book temp = bookshelf.get(i);
        bookshelf.remove(i);
        return temp;
    }

    public void printLR(){
        for(int i = 0; i < bookshelf.size(); i++){
            System.out.println(bookshelf.get(i).toString());
        }
    }

    public void printRL(){
        for(int i = bookshelf.size() - 1; i>=0; i--){
            System.out.println(bookshelf.get(i).toString());
        }
    }
}

И, наконец, мой основной класс, где я его тестирую:

 public static void main(String[] args) {

        Book bookOne = new Book(101, "Hello");
        Book bookTwo = new Book(102, "Bye");
        Book bookThree = new Book(103, "Morning");
        Dictionary dictionaryOne = new Dictionary("104", "Afternoon", 10, "English", "Spanish", 10);
        Dictionary dictionaryTwo = new Dictionary("105", "Evening", 10, "English", "Spanish", 10);

        Bookshelf bookshelf = new Bookshelf();

        bookshelf.addBookOnLeftSide(dictionaryOne);
        bookshelf.addBookOnLeftSide(bookOne);
        bookshelf.addBookOnLeftSide(bookThree);
        bookshelf.addBookOnLeftSide(dictionaryTwo);
        bookshelf.addBookOnLeftSide(bookTwo);

        moveDictionaries(bookshelf);
        bookshelf.printLR();
    }

Проблема, с которой я сталкиваюсь, заключается в том, что при запуске этого метода не работает, как ожидалось. Он перемещает только один из словарей, а другой почему-то пропадает. Я не уверен, почему это происходит. Любая помощь будет великолепна.

1 Ответ

0 голосов
/ 05 февраля 2020

Рассмотрим ваш код:

for(int i = 0; i<b.size(); i++) {
    Book temp = b.bookshelf.get(i);
    if(temp instanceof Dictionary){
        b.bookshelf.remove(temp);
        b.bookshelf.add(size - 1, temp);
    }
}

Рассмотрим случаи, когда у вас есть книжная полка: B1, D1, D2, B3 и i = 1

В этом случае D1 будет перемещен в конец и я буду увеличиваться, оставляя книжную полку B1, D2, B3, D1 и i = 2

На следующей итерации будет рассматриваться B3, пропуская D2 в целом.

Ваш код должен выглядеть как

int start = 0;
int end = bookshelf.size();
while (start < end) {
    if (bookshelf.get(start) instanceof Dictionary) {
        bookshelf.moveToEnd(start);
        end--;
    } else {
        start++;
    }
}
...