链接列表从文件读取,排序和逐个错误

时间:2015-07-19 14:58:42

标签: java linked-list priority-queue

我必须创建一个链接列表,该列表读取字符串和关联的int的文件,并在读取时按int排序。到目前为止,我已经有了一个方法来向列表中添加一个元素,以及一个基本的读取方法(但由于某种原因缺少文件中的最后一个元素),但每次我尝试向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'):

    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
        if (rank == 0)
        {
            addFirst(name, rank);                   //enqueues ship name and rank into list
        }
    }

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

编辑:添加样本数据集。我只需要找出我在概念上搞砸的地方。

ship1 0    ship2 10    ship3 27    ship4 2    ship5 7    ....

EDIT2:

好的,暂时放弃使用链接列表计算插入,并且只创建一个基于sentinel的插入read()方法。谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

这里只是问这个评论太大了:

假设addFirst方法用于添加到链接列表的头部并且Ships确实具有属性nextprev,那么您不想要:

if(!isEmpty){

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

}

或者如果你想在链表的尾部添加你不想要的:

if(!isEmpty){

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

    // take out first = newShip

}

无论哪种方式,看起来你可能不对。如我错了请纠正我。

答案 1 :(得分:2)

我尝试使用你的readFile方法,它似乎与我合作,正确阅读文件! 但是addFirst(String name, int rank)

似乎有错误

您在else条件下实际执行的操作是将newShip添加为第二个元素(在第一个元素之后),但是您没有注意到可能存在的事实第一个元素之后的更多项目!您也没有处理next的{​​{1}}。

例如:如果您的列表是::(虽然使用了您获得的代码,但仍然可以像这样制作链接列表!示例只是为了解释)

newShip 1<-->2<-->3-->NULL指向first

然后添加新元素1

您的链接看起来像这样::

4 1<-->4<-->DANGLING指向first

4 1<--2<-->3-->NULL

照顾我使用的尖括号,它是指针的方向!

您似乎正在尝试添加到链接列表的前面! 所以,你的代码应该看起来像这样!!

No pointer through which we can this part of the Linked List!