链表从文件中读取,排序和差一错误
Linked List read from file, sorting and off-by-one errors
我必须创建一个链表来读取字符串文件和关联的 int,并在读取时按 int 排序。到目前为止,我已经获得了一种将元素添加到列表的方法,以及一种基本的读取方法(但由于某种原因缺少文件中的最后一个元素),但每次我尝试向读取方法添加条件时,它 returns 一个空列表。
我的添加方法:
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 似乎根本没有阅读列表。如果我无法弄清楚为什么添加方法被破坏,我就无法开始将条件放入插入算法中。
编辑:添加示例数据集。我只需要找出我在概念上搞砸了的地方。
ship1 0
船2 10
船3 27
船 4 2
船5 7
....
编辑 2:
好吧,暂时放弃使用链表来解决插入问题,将只创建一个基于哨兵的插入 read() 方法。感谢您的帮助。
只是在这里问一下,因为它太大了,无法发表评论:
假设 addFirst
方法用于添加到链表的头部,并且 Ships 确实具有属性 next
和 prev
,您是否想要:
if(!isEmpty){
first.prev = newShip;
newShip.next = first;
first = newShip;
}
或者如果你想在链表的尾部添加你不想要:
if(!isEmpty){
last.next = newShip;
newShip.prev = last;
// take out first = newShip
}
不管怎样,看来你的东西未必是对的。如果我错了纠正我。
我试过你的readFile
方法,对我来说似乎没问题,正确读取文件!
但是您的 addFirst(String name, int rank)
中似乎有错误
您在 else
条件中实际做的是将 newShip
添加为第二个元素(在第一个元素之后),但您没有考虑可能存在的事实第一个元素之后的更多项目! newShip
.
中的 next
你都不在意
例如:如果您的列表是::(尽管使用您拥有的代码,您将无法创建这样的链接列表!示例只是为了解释)
1<-->2<-->3-->NULL
first
指向 1
然后在你添加一个新元素后4
您的 link 看起来像这样::
1<-->4<-->DANGLING
first
指向 4
和
1<--2<-->3-->NULL
No pointer through which we can this part of the Linked List!
注意我用过的尖括号,是指针的方向!
您似乎想添加到 linked 列表的前面!
所以,你的代码应该看起来像这样!!
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;
}
}
我必须创建一个链表来读取字符串文件和关联的 int,并在读取时按 int 排序。到目前为止,我已经获得了一种将元素添加到列表的方法,以及一种基本的读取方法(但由于某种原因缺少文件中的最后一个元素),但每次我尝试向读取方法添加条件时,它 returns 一个空列表。
我的添加方法:
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 似乎根本没有阅读列表。如果我无法弄清楚为什么添加方法被破坏,我就无法开始将条件放入插入算法中。
编辑:添加示例数据集。我只需要找出我在概念上搞砸了的地方。
ship1 0 船2 10 船3 27 船 4 2 船5 7 ....
编辑 2:
好吧,暂时放弃使用链表来解决插入问题,将只创建一个基于哨兵的插入 read() 方法。感谢您的帮助。
只是在这里问一下,因为它太大了,无法发表评论:
假设 addFirst
方法用于添加到链表的头部,并且 Ships 确实具有属性 next
和 prev
,您是否想要:
if(!isEmpty){
first.prev = newShip;
newShip.next = first;
first = newShip;
}
或者如果你想在链表的尾部添加你不想要:
if(!isEmpty){
last.next = newShip;
newShip.prev = last;
// take out first = newShip
}
不管怎样,看来你的东西未必是对的。如果我错了纠正我。
我试过你的readFile
方法,对我来说似乎没问题,正确读取文件!
但是您的 addFirst(String name, int rank)
您在 else
条件中实际做的是将 newShip
添加为第二个元素(在第一个元素之后),但您没有考虑可能存在的事实第一个元素之后的更多项目! newShip
.
next
你都不在意
例如:如果您的列表是::(尽管使用您拥有的代码,您将无法创建这样的链接列表!示例只是为了解释)
1<-->2<-->3-->NULL
first
指向 1
然后在你添加一个新元素后4
您的 link 看起来像这样::
1<-->4<-->DANGLING
first
指向 4
和
1<--2<-->3-->NULL
No pointer through which we can this part of the Linked List!
注意我用过的尖括号,是指针的方向!
您似乎想添加到 linked 列表的前面! 所以,你的代码应该看起来像这样!!
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;
}
}