首页 > 解决方案 > 删除和排序 LinkedList 中的项目 - Java

问题描述

我有一个用于存储一些项目的 LinkedList 数据结构。这个问题是要求我使用标准 java.utils LinkedList 的课程的一部分。基本场景是能够将书籍和字典添加到 LinkedList,然后删除它们。我现在坚持的问题需要对 LinkedList 进行排序,以便所有字典都位于 LinkedList 的末尾,而 Books 位于开头。

这是我当前对项目进行排序的代码:

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

Dictionary 是 Book 的子类。我所做的是使用 for 循环遍历列表。我检查当前项目是否是字典,如果是,我将它添加到 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();
    }

我遇到的问题是,当我运行此方法时,它无法按预期工作。它只移动了一本字典,而另一本不知何故丢失了。我不确定为什么会这样。任何帮助都会很棒。

标签: javafor-looplinked-list

解决方案


考虑您的代码:

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 将移动到末尾,并且 i 将递增,留下 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++;
    }
}

推荐阅读