所以我有一个while循环,它捕获外部文件中的每一行字符串,并使用字符串标记器逐字分离它们。接下来,每个单词都要进入一个连接的链表中。由于每一行的大小不同,我不知道该如何编程,所以可以根据需要多次创建链表。
例如:
文件中的第一行="你好"文件中的第二行="我很好,你好吗"
正如您所看到的,第二行使用字符串标记器的单词将比第一行多。我该如何着手解决这样的问题?
我是一名学生,仍在学习,必须使用链表。。。没有数组
我真的很感激你的帮助。
这是主块的代码:
public static void main(String[] args) throws IOException
{
dataInpt=new File("C:\sentences.txt");
inFile=new Scanner(dataInpt);
StringTokenizer myTokens;
String line, sentence;
Node node1 = new Node();
while (inFile.hasNextLine())
{
line=inFile.nextLine();
myTokens=new StringTokenizer(line);
while (myTokens.hasMoreTokens())
{
sentence=myTokens.nextToken();
正如你所看到的,这并不完全。我不知道下一步该怎么做,因为如果我做node.value=myTokens.nextToken(),则它只会将该单词保存到节点上,而不是为每个单词添加一个节点,同时链接所有节点,使node="Hi"和node.next="How"和node.next.next="are"…等等。
这是节点的类:
public class Node
{
public Object value;
public Node next;
public Node()
{
value=null;
next=null;
}
public Node (Object value, Object value2, Node next)
{
this.value=value;
this.next=next;
}
}
如果你还有什么问题,请问。我真的需要帮助。
List list = new LinkedList<String>();
while (something) {
/* tokenise words here */
list.add(str);
}
String line = "Hi how are you";
LinkedList<String> wordsAsList = new LinkedList<String>(
Arrays.asList(line.split("\s+"))
)
简单的答案是:您不必知道列表中有多少元素。
答案更长:链表的主要好处之一是它可以动态增长。如果列表中有N个节点,并且在列表的开头添加了一个新节点,则不需要更改现有节点。除了当前添加到列表中的节点之外,您不需要初始化新数组、复制元素或其他任何操作。
因此,对于您的特定问题,您可能希望为文件的每一行创建一个新的链表,然后将该行的每个单词添加到链表中。当你读完这一行时,你会有一个包含该行单词的链表,然后你可以打印或以其他方式使用该列表。
因此,您已经使用节点实现了自己的链表。到目前为止,你的想法是正确的:对于每一行,你将行中的每个单词分开,并用它做一些事情。因为你需要实现连接每个节点的指针,所以你可以考虑做的主要事情是:找到一种保存前一个单词的方法,这样你就可以在节点之间创建正确的链接。这可能意味着需要在最里面的while()
循环之外存储一个指针。
正如有人暗示的那样,听起来似乎您希望创建一个链接列表,其中每个节点都与文件的一行相关。然而,每一行都被表示为它自己的单词链表。换言之,您希望创建一个链表。我不确定你的这项作业有什么限制,但听起来你需要滚动自己的"节点"类。我建议您也推出自己的"LinkedList"类。。。但这取决于你。
Node fileHead = null;
Node lineHead = null;
Node currentLine = null;
tokenize file // Read the file in line by line
for each line in the file
Node currentWord = null; // Keep track of which word was the last added
tokenize line
for each word in the line
if lineHead is null // Check to see if this is the 1st word
lineHead = new Node(); // If so, set it to the head node for the line
lineHead.value = word;
currentWord = lineHead; // Make this your current word
else // If this isn't the 1st word of the line
Node node = new Node(); // Create a new node
node.value = word;
currentWord.next = node; // Set the previous node's "next" to the new one
currentWord = node; // Update your current node to this new one
if fileHead is null // If this is the 1st line of the file
fileHead = lineHead; // Make the 1st line's 1st word the start
currentLine = fileHead; // Update the current line to this 1st one
else // If this isn't the 1st line of the file
currentLine.next = lineHead; // Make the 1st word of this line the start of the next line
currentLine = currentLine.next; // Update the current line to this new one
lineHead = null; // Reset the head of the line to null
我不是很乐观,因为我刚刚起草了这个,但这样的事情应该会奏效,或者至少会给你指明正确的方向。我个人更喜欢双重链接列表。。。