Запуск цикла while для создания связанных списков в Java - PullRequest
1 голос
/ 15 февраля 2012

Итак, у меня есть цикл 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.

вот класс для узла:

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 голосов
/ 15 февраля 2012

Как намекнул кто-то, звучит так, как будто вы хотите создать список ссылок, каждый узел которого связан с одной строкой файла. Однако каждая строка представляется в виде собственного связанного списка слов. Другими словами, вы хотите создать связанный список связанных списков. Я не уверен, каковы ограничения для этого вашего назначения, но похоже, что вы должны бросить свой собственный класс "Узел". Я бы тоже порекомендовал создать свой собственный класс "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

Я не уверен, потому что я только что разработал это, но что-то вроде этого должно работать, или, по крайней мере, направить вас в правильном направлении. Я лично предпочитаю двусвязные списки ...

0 голосов
/ 15 февраля 2012

Краткий ответ: вам не нужно знать, сколько элементов будет в вашем списке.

Более длинный ответ: Одним из основных преимуществ связанного списка является его динамический рост.Если в вашем списке есть N узлов, и вы добавляете новый узел в начало списка, существующие узлы менять не нужно.Вам не нужно инициализировать новый массив, копировать элементы или что-либо, кроме узла, который вы в данный момент добавляете в список.

Итак, для вашей конкретной проблемы вы, вероятно, захотите создать новый связанный списокдля каждой строки файла, а затем добавьте каждое слово строки в связанный список.Когда вы закончите чтение строки, у вас будет связанный список, содержащий слова для этой строки, а затем вы сможете распечатать или иным образом использовать этот список.

0 голосов
/ 15 февраля 2012
String line = "Hi how are you";

LinkedList<String> wordsAsList = new LinkedList<String>(
   Arrays.asList(line.split("\\s+"))
)
0 голосов
/ 15 февраля 2012

Итак, вы реализовали свой собственный связанный список, используя узлы.Пока у вас есть правильная идея: для каждой строки вы отделяете каждое слово в строке и что-то с ним делаете.Поскольку вам необходимо реализовать указатели , которые соединяют каждый узел, вот главное, что вы могли бы подумать сделать: Найдите способ сохранить слово предыдущий , чтобы вы могли создать правильноессылки между узлами.Это может означать необходимость хранить указатель вне вашего внутреннего цикла while().

0 голосов
/ 15 февраля 2012
List list = new LinkedList<String>();

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

    list.add(str);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...