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

时间:2012-02-15 01:10:48

标签: java linked-list

所以我有一个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”.. .etc。

这是Node的类:

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;
  }
}

如果您还有其他问题,请询问。我真的需要帮助。

5 个答案:

答案 0 :(得分:0)

List list = new LinkedList<String>();

while (something) {
    /* tokenise words here */

    list.add(str);
}

答案 1 :(得分:0)

String line = "Hi how are you";

LinkedList<String> wordsAsList = new LinkedList<String>(
   Arrays.asList(line.split("\\s+"))
)

答案 2 :(得分:0)

因此,您已使用节点实现了自己的链接列表。到目前为止,您有正确的想法:对于每一行,您将行中的每个单词分开并对其执行某些操作。因为您需要实现连接每个节点的指针,所以您可以考虑做以下事情:找出一种保存上一个字的方法,以便您可以创建节点之间的正确链接。这可能意味着需要将指针存储在最里面的while()循环之外。

答案 3 :(得分:0)

简短回答:您不必知道列表中有多少元素。

答案越长:链表的主要好处之一是它会动态增长。如果列表中有N个节点,并且将新节点添加到列表的头部,则不需要更改现有节点。您不需要初始化新数组,复制元素或除当前添加到列表中的节点之外的任何内容。

因此,对于您的特定问题,您可能希望为文件的每一行创建一个新的链接列表,然后将该行的每个单词添加到链接列表中。完成阅读后,您将拥有一个包含该行字样的链接列表,然后您可以打印或以其他方式使用该列表。

答案 4 :(得分:0)

正如有人暗示的那样,听起来好像你希望制作一个链接列表,其每个节点都与文件的一行有关。然而,每一行都表示为它自己的单词链接列表。换句话说,您正在寻找链表的链表。我不确定你的这个分配的限制是什么,但听起来你需要推出自己的“Node”类。我建议也推荐你自己的“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

我不是肯定的,因为我刚刚起草了这个,但是这样的事情应该起作用,或者至少指出你正确的方向。我个人更喜欢双链表...