运行while循环以在java中创建链表



所以我有一个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

我不是很乐观,因为我刚刚起草了这个,但这样的事情应该会奏效,或者至少会给你指明正确的方向。我个人更喜欢双重链接列表。。。

相关内容

  • 没有找到相关文章

最新更新