java - 创建包含文本源的唯一字节点的 LinkedList

标签 java linked-list

我想创建一个包含文本中唯一单词的节点LinkedList,并为每个节点创建另一个包含文本中跟随它们的单词的列表。
我已经想出了这段代码,但它不正确。似乎方法 contains 总是产生 false。有什么建议吗?

public void train(String sourceText){
    String[] words=sourceText.split("\\s+");
    List<String> textList=Arrays.asList(words);
    starter=textList.get(0);
    System.out.println(starter);
    ListNode prevWord= new ListNode(starter);
    wordList = new LinkedList<ListNode>();
    wordList.add(prevWord);
    for (int i=1;i<textList.size();i++){
        if (wordList.contains(prevWord)){
            prevWord.addNextWord(textList.get(i));
        }
        else{
            wordList.add(prevWord);
            prevWord.addNextWord(textList.get(i));
            }
        prevWord=new ListNode(textList.get(i));
    }
}

class ListNode
{
    private String word;

    private List<String> nextWords;

    ListNode(String word)
    {
        this.word = word;
        nextWords = new LinkedList<String>();
    }

    public String getWord()
    {
        return word;
    }

    public void addNextWord(String nextWord)
    {
        nextWords.add(nextWord);
    }
}

最佳答案

正如您正确发现的那样,wordList.contains(prevWord) 总是返回 false - 这是因为 java 检查对象相等性,这意味着对象是相同的 - 不看相同,但实际上是完全相同的对象。

但除此之外,我认为您的进展顺利 - 我仍然对您的代码进行了相当多的更改,但您可能会看到您的尝试中留下的一些方面:

public void train(String sourceText){
    String[] words = sourceText.split("\\s+");

    LinkedList<ListNode> wordList = new LinkedList<>();
    outerLoop: for (int i = 0; i < words.length; i++) {
        for (ListNode node : wordList) {
            if (node.getWord().equals(words[i])) {
                if (i != words.length - 1) {
                    node.addNextWord(words[i+1]);
                }
                continue outerLoop;
            }
        }

        ListNode node = new ListNode(words[i]);
        wordList.add(node);
        if (i != words.length - 1) {
            node.addNextWord(words[i+1]);
        }            
    }

    System.out.println(wordList.size());
}

让我解释一下这段代码的作用:

  • 它会拆分单词(就像您所做的那样)
  • 它创建一个空的 ListNode 列表
  • 它循环显示单词
    • 它会在列表中查找任何已存在的具有相同单词ListNode
    • 如果找到当前单词之后的单词,则将其添加到 ListNodesnextWords 列表中
    • 如果没有找到匹配的节点,代码将到达循环的第二部分,我将在其中创建一个新节点
  • 该节点已添加到节点列表中,并且可能会添加下一个单词

该代码并不完美,有重复并使用标签并继续,但您可以很容易地摆脱它们。

关于java - 创建包含文本源的唯一字节点的 LinkedList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34386123/

相关文章:

java - Android - 无法创建从 OptionMenu 触发的新 Intent

Java:无法让 readline() 工作

c - 链表缺失元素

c++ - 在链接列表中按升序插入对象

java - 在已排序的链表中插入节点

c - 在链表 C 中插入字符串或字符

Java WebApp 安全框架

java - 从生成的 pom 和源构建 Artifact

java "this"关键字正确使用

java - 类转换错误尝试对链接列表中的节点和元素使用compareTo