Использование универсального класса Pair и Splaytree для подсчета и хранения слов и их частот в Java

Я реализую 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...

Splaytree:

public class SplayTree<AnyType extends Comparable<? super AnyType>> {

public SplayTree( )
{
    nullNode = new BinaryNode<AnyType>( null );
    nullNode.left = nullNode.right = nullNode;
    root = nullNode;
}

И имеет класс BinaryNode.

У меня возникли проблемы с тем, как для каждой пары слов и частот поместить ее в дерево, а также проверить, существует ли пара и, если да, на одну частоту. Я построчно читаю в текстовом файле и разбиваю каждую строку на слова, а затем выполняю метод 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 и позволяю ему поместить его в соответствующий узел.

Прямо сейчас я просто запутался, работая над одним и тем же фрагментом кода слишком много часов, чем это необходимо, я был бы очень признателен за некоторые указатели, которые могут привести меня в правильном направлении!

Спасибо и, пожалуйста, скажите мне, если я не прояснил себя.

1 ответ

Я предлагаю использовать стандартную реализацию Splay Tree, то есть без счетчиков, и иметь отдельный HashMap для частот. Это не жертвует сложностью, поскольку операции над деревом сопряжения выполняются O(log n), а операции над HashMap О (1). Чтобы сохранить инкапсуляцию и инварианты, вы можете поместить оба в больший класс, который предоставляет необходимые операции.

Другие вопросы по тегам