Java 从文件读取链表,按一个错误排序和关闭

Java 从文件读取链表,按一个错误排序和关闭,java,linked-list,priority-queue,Java,Linked List,Priority Queue,我必须创建一个链表来读取字符串和相关int的文件,并在读取时按int排序。到目前为止,我已经得到了一个向列表中添加元素的方法和一个基本的read方法(但由于某种原因缺少文件中的最后一个元素),但是每次我尝试向read方法添加条件时,它都会返回一个空列表 我的添加方法: public void addFirst(String name, int rank) { Ship newShip = new Ship(name, rank); if (isEmpty()) {

我必须创建一个链表来读取字符串和相关int的文件,并在读取时按int排序。到目前为止,我已经得到了一个向列表中添加元素的方法和一个基本的read方法(但由于某种原因缺少文件中的最后一个元素),但是每次我尝试向read方法添加条件时,它都会返回一个空列表

我的添加方法:

public void addFirst(String name, int rank)
{
    Ship newShip = new Ship(name, rank);

    if (isEmpty())
    {
        newShip.next = null;
        newShip.prev = null;
        last = newShip;
        first = newShip;
    }
    else
    {
        first.next = newShip;
        newShip.prev = first;
        first = newShip;
    }
}
以及我的工作(但只需一次)读取方法:

public void readFile(String filename) throws IOException
{
    try
    {
    File inFile = new File(filename);           //inst. file import
    Scanner read = new Scanner(inFile);         //inst. scanner object

    while (read.hasNext())                      //reads until end of text
    {
        String name = read.next();              //scanner reads next string, assigns to name
        int rank = read.nextInt();              //reads next int, assigns to rank
        addFirst(name, rank);                   //enqueues ship name and rank into list
    }
    read.close();                               //ends read when empty
    }

    catch(IOException exc)
    {
        System.out.println("Error: file not found");
    }

}
每次我向read方法中的while()添加一个条件时,就像这样(数据文件中有一个“0”):

Tt似乎根本没有读过这个列表。如果我不能弄清楚add方法被破坏的原因,我就不能开始在插入算法中添加条件

编辑:添加示例数据集。我只需要弄清楚我在概念上把事情搞砸了

10号船 船舶2 10 船舶3 27 船舶4 2 船舶5 7

编辑2:


好的,现在放弃使用链表来计算插入,只创建一个基于sentinel的插入read()方法。谢谢你的帮助。

请在这里提问,因为它太大了,无法发表评论:

假设
addFirst
方法用于添加到链接列表的头部,并且船舶确实具有
next
prev
属性,您不希望:

if(!isEmpty){

    first.prev = newShip;
    newShip.next = first;
    first = newShip;

}
if(!isEmpty){

    last.next = newShip;
    newShip.prev = last;

    // take out first = newShip

}
或者,如果要在链接列表的末尾添加,您不希望:

if(!isEmpty){

    first.prev = newShip;
    newShip.next = first;
    first = newShip;

}
if(!isEmpty){

    last.next = newShip;
    newShip.prev = last;

    // take out first = newShip

}

不管怎样,你所拥有的似乎并不正确。如果我错了,请纠正我

请在这里提问,因为它太大了,无法发表评论:

假设
addFirst
方法用于添加到链接列表的头部,并且船舶确实具有
next
prev
属性,您不希望:

if(!isEmpty){

    first.prev = newShip;
    newShip.next = first;
    first = newShip;

}
if(!isEmpty){

    last.next = newShip;
    newShip.prev = last;

    // take out first = newShip

}
或者,如果要在链接列表的末尾添加,您不希望:

if(!isEmpty){

    first.prev = newShip;
    newShip.next = first;
    first = newShip;

}
if(!isEmpty){

    last.next = newShip;
    newShip.prev = last;

    // take out first = newShip

}

不管怎样,你所拥有的似乎并不正确。如果我错了,请纠正我

我试过使用你的
readFile
方法,它似乎对我很好,正确地读取文件! 但是您的
addFirst(字符串名,int-rank)中似乎有一个错误

else
条件中,您实际要做的是添加
新闻
作为第二个元素(在第一个元素之后),但不考虑第一个元素之后可能会有更多项目!您也不关心
新闻
下一个

例如:如果您的列表是::(尽管使用代码,您将无法创建这样的链接列表!示例仅用于解释)

123-->NULL
第一个
指向
1

然后在添加新元素
4

您的链接将如下所示:

14悬挂
首先
指向
4

1NULL
没有指针,我们可以通过它查看链接列表的这一部分

注意我用过的尖括号,它是指针的方向

似乎您正试图添加到链接列表的前面! 所以,你的代码应该是这样的

public void addFirst(String name, int rank)
{
    Ship newShip = new Ship(name, rank);

    if (isEmpty())
    {
        newShip.next = null;
        newShip.prev = null;
        last = newShip;
        first = newShip;
    }
    else
    {
        first.prev = newShip;
        newShip.next = first;
        newShip.prev = NULL; // to ensure there are no dangling pointers
        first = newShip;
    }
}

我试过使用你的
readFile
方法,它似乎对我很好,正确地读取文件! 但是您的
addFirst(字符串名,int-rank)中似乎有一个错误

else
条件中,您实际要做的是添加
新闻
作为第二个元素(在第一个元素之后),但不考虑第一个元素之后可能会有更多项目!您也不关心
新闻
下一个

例如:如果您的列表是::(尽管使用代码,您将无法创建这样的链接列表!示例仅用于解释)

123-->NULL
第一个
指向
1

然后在添加新元素
4

您的链接将如下所示:

14悬挂
首先
指向
4

1NULL
没有指针,我们可以通过它查看链接列表的这一部分

注意我用过的尖括号,它是指针的方向

似乎您正试图添加到链接列表的前面! 所以,你的代码应该是这样的

public void addFirst(String name, int rank)
{
    Ship newShip = new Ship(name, rank);

    if (isEmpty())
    {
        newShip.next = null;
        newShip.prev = null;
        last = newShip;
        first = newShip;
    }
    else
    {
        first.prev = newShip;
        newShip.next = first;
        newShip.prev = NULL; // to ensure there are no dangling pointers
        first = newShip;
    }
}

添加您正在从文件中读取的示例数据添加您正在从文件中读取的示例数据如果他正在将其添加到链表的尾部,则应为
last.next=newShip
newShip.prev=last
您是对的,这就是我粘贴代码得到的结果。不管怎样,你显然有更详细的答案。如果他在链表的尾部添加,答案应该是
last.next=newShip
newShip.prev=last
你说得对,这就是我粘贴代码得到的结果。无论如何,你显然有更详细的答案