创建包含文本源的唯一wordnodes的LinkedList



我想创建一个包含文本中唯一单词的节点的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列表
  • 它在单词上循环
    • 它在列表中查找具有相同CCD_ 7的任何已经存在的CCD_
    • 如果在当前单词添加到ListNodesnextWords列表之后找到该单词
    • 如果没有找到匹配的节点,代码就会到达循环的第二部分,在那里我创建了一个新节点
  • 该节点被添加到节点列表中,可能会添加下一个单词

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

这就是最终的效果。感谢大家的帮助,尤其是Luk。由于在进入for节点循环时单词列表为空,您的代码出现了空指针异常。

public void train(String sourceText){
        String[] words=sourceText.split("\s+");
        //List<String> textList=Arrays.asList(words);
        starter=words[0];
        ListNode prevWord= new ListNode(starter);
        wordList = new LinkedList<>();
        wordList.add(prevWord);
        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());
}

相关内容

  • 没有找到相关文章

最新更新