Java 断字问题:阴性情况下未获得预期的O/P

Java 断字问题:阴性情况下未获得预期的O/P,java,algorithm,Java,Algorithm,我已经用java编写了一个关于断字问题的代码。这个想法是返回字典中的单词列表,当这些单词组合在一起时,就会得到输入的字符串。我在我的方法中使用了TRIE数据结构。它在阳性病例中效果良好,但在阴性病例中效果不如预期 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class WordBreakProblem { public

我已经用java编写了一个关于断字问题的代码。这个想法是返回字典中的单词列表,当这些单词组合在一起时,就会得到输入的字符串。我在我的方法中使用了TRIE数据结构。它在阳性病例中效果良好,但在阴性病例中效果不如预期

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WordBreakProblem {

    public class Node{

        String prefix;
        Map<Character, Node> children;
        boolean isWord;

        public Node(String prefix){
            this.prefix = prefix;
            children = new HashMap<Character, Node>();
            isWord = false;
        }
    }

    Node trie;
    public WordBreakProblem(String[] words){
        trie = new Node("");
        for(String s : words){
            insertIntoTrie(s);
        }

    }

    private void insertIntoTrie(String s) {
        Node curr = trie;
        for(int i=0; i<s.length(); i++){
            if(!curr.children.containsKey(s.charAt(i)))
                curr.children.put(s.charAt(i), new Node(s.substring(0, i+1)));
            curr = curr.children.get(s.charAt(i));
            if(i == s.length()-1)
                curr.isWord = true;
        }

    }

    public ArrayList<String> searchForPair(String str, ArrayList<String> list){
        Node curr = trie;
        int i;
        for(i = 0; i<str.length(); i++){
            if(curr.children.containsKey(str.charAt(i))){
                curr = curr.children.get(str.charAt(i));
            }
            else
                break;
        }
        if(curr.isWord){
            list.add(curr.prefix);
            searchForPair(str.substring(i), list);
        }
        else
            return null;

        return list;
    }

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        WordBreakProblem w = new WordBreakProblem(new String[]{"news", "abcd", "tree", "geeks", "paper"});
        List<String> al = w.searchForPair("newsgeeksabc", list);
        for(String s : al){
            System.out.println(s);
        }
    }
}
因为“abc”在字典中不存在,所以它应该返回null

问题似乎就在这里:

if(curr.isWord){
            list.add(curr.prefix);
            searchForPair(str.substring(i), list);
        }
        else
                   return null;

要理解您的代码有点困难,因为我不完全确定为什么您希望它返回null。从我收集到的信息来看,您希望它返回
null
,因为您遇到了一些不是单词的东西-因此,尽管之前找到了单词,您还是希望将它们扔掉并返回null

这是因为在递归调用中忽略了返回值:

    if(curr.isWord){
        list.add(curr.prefix);
        searchForPair(str.substring(i), list);  // HERE
    }
    else
               return null;

    return list;
即使递归调用返回
null
,您也会忽略它并仍然返回
list

处理接收
null
的情况:

if (curr.isWords) {
  list.add(curr.prefix);
  List<String> result = searchForPair(str.substring(i), list);
  if (result == null) {
    return null;
  }
} else {
  return null;
}
return list;
  • 在找不到任何单词的情况下,返回
    null
    是很尴尬的,因为调用代码必须处理null的情况。如果您返回一些非空值来表示“未找到单词”,例如空列表,则API可能更易于使用


  • 我同意您关于使用null的评论。但是,在某些情况下,我更喜欢返回null。例如,如果我使用一个对某些物理观测进行数学运算的库,如果出现严重错误,该库将返回null。在这种情况下,如果我打算扩展该库的功能,那么返回null也是兼容的。你对此有何看法?你认为为这些类型的东西返回null是否适用?@Maximus如果出现严重错误,抛出异常。这就是他们的目的。也许,在java和C++中是的。但即便如此,上面的代码也必须处理异常,就像它必须处理null一样。(尽管例外情况使如何处理问题变得更加明确)。然而,对于C背景的人,或者对于使用C++和/或java(如JNI)一起使用C的人来说,返回null使得可读性更加一致,因为最初用C语言编写然后移植到其他语言的数学/物理库在不产生任何输出的成功运行时几乎总是返回null。检查输出是否为null也比检查其大小是否小于某个幻数更有意义。通过检查null,实际上就是检查空输出。通过检查大小(或任何其他检查),您必须阅读代码的其余部分以了解发生了什么。但是如果你只是虔诚地检查空值,对读者来说,这意味着有一个数学问题,它不应该发生,所以只要改变它并离开函数就行了。至于异常,我认为最好把它们留给异常情况。为代码的每个可能的空结果引发异常?我不知道,也许放一些空值,然后为空值集合抛出一个异常?也许那样会更好。但这正是我喜欢的方式,也许工业界不这么做。
    if (curr.isWords) {
      list.add(curr.prefix);
      List<String> result = searchForPair(str.substring(i), list);
      if (result == null) {
        return null;
      }
    } else {
      return null;
    }
    return list;
    
    if(!curr.isWord){
      return null;
    }
    list.add(curr.prefix);
    searchForPair(str.substring(i), list);  // HERE
    return list;