Java 断字问题:阴性情况下未获得预期的O/P
我已经用java编写了一个关于断字问题的代码。这个想法是返回字典中的单词列表,当这些单词组合在一起时,就会得到输入的字符串。我在我的方法中使用了TRIE数据结构。它在阳性病例中效果良好,但在阴性病例中效果不如预期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
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;