我正在实现一个splaytree来保存单词及其频率,并选择创建一个Pair类来保存每个字频(键值)对。也就是说,splaytree的每个节点都拥有一对Pair类。 Pair类看起来像这样:
public class SplayEntry<K, V> implements Comparable<SplayEntry<K, V>>{
public K word;
public V frequency;
public SplayEntry(K word, V frequency) {
this.word = word;
this.frequency = frequency;
}
getters, setters, hashCode, equals, compareTo etc...
The Splaytree:
public class SplayTree<AnyType extends Comparable<? super AnyType>> {
public SplayTree( )
{
nullNode = new BinaryNode<AnyType>( null );
nullNode.left = nullNode.right = nullNode;
root = nullNode;
}
并且有BinaryNode类。
我遇到的问题是,如何将每个字和频率对放入树中,并检查该对是否已经存在,如果是这样,则频率为1。我逐行阅读文本文件并将每行分成单词,然后执行一个countWords()方法,现在是一团糟:
public void countWords(String line) {
line = line.toLowerCase();
String[] words = line.split("\\P{L}+");
SplayEntry<String, Integer> entry = new SplayEntry<String, Integer>(null, null);
for (int i = 0, n = words.length; i < n; i++) {
Integer occurances = 0;
entry.setWord(words[i]);
entry.setFrequency(occurances);
if (tree.contains(entry.equals(entry)) && entry.getFrequency() == 0) {
occurances = 1;
} else {
int value = occurances.intValue();
occurances = new Integer(value + 1);
entry.setFrequency(occurances);
}
entry = new SplayEntry<String, Integer>(words[i], occurances);
tree.insert(entry);
}
}
我知道这不是真的有用,我需要帮助弄清楚我应该如何实例化SplayEntry类以及按什么顺序?我还希望方法为单词数组中的每个单词检查它是否存在于树内(包含)的SplayEntry中,如果单词是新单词,那么频率将为1,否则,频率将为为+1。最后,我只是将新的SplayEntry添加到Splaytree中,然后将其放入适当的节点中。
现在我只是混淆了自己,因为我需要花费太多时间来处理同一段代码,我非常感谢能够引导我朝着正确方向前进的一些指针!
如果我没有说清楚,请告诉我。
答案 0 :(得分:1)
我建议使用splay树的标准实现,即没有计数器,并且频率分别为HashMap
。这不会牺牲复杂性,因为对splay树的操作是O(log n),而HashMap
上的操作是O(1)。为了保留封装和不变量,您可以将它们放在一个更大的类中,以暴露所需的操作。