Ключ поиска для двоичного дерева поиска, заполненного текстовым файлом (Java) - PullRequest
0 голосов
/ 20 ноября 2018

Привет, я довольно новичок в программировании и у меня есть проект, с которым я надеялся получить помощь.Я должен прочитать некоторые имена и номера телефонов из текстового файла, а затем использовать их для заполнения двоичного дерева поиска.Каждая строка в текстовом файле (всего 5 строк) имеет имя одного человека (первое и последнее) вместе с номером телефона.Затем я должен использовать поисковый ключ для поиска имени каждого человека.Вот инструкции:

Напишите программу, которая позволит вам сохранять и извлекать телефонные номера.Разработайте консольную программу, которая выполняет следующие операции:

Добавить: добавляет имя и номер телефона человека в телефонную книгу.

Удалить: удаляет имя и номер телефона данного человека из телефонной книги, указав только имя.

Найти: Находит номер телефона человека, учитывая только имя человека.

Изменение: изменяет номер телефона человека, учитывая его имя и новый номер телефона.

Выход: выход из приложения после первого сохранения телефонной книги в текстовом файле.

Вы можете действовать следующим образом:

Разработать и реализовать класс Person, который представляет имя и номер телефона человека.Вы будете хранить экземпляры этого класса в телефонной книге.Разработайте и реализуйте класс PhoneBook, который представляет телефонную книгу.Класс должен содержать двоичное дерево поиска в качестве поля данных.Это дерево содержит людей в книге.Добавьте методы, которые используют текстовый файл для сохранения и восстановления дерева.Разработайте и внедрите класс Menu, который обеспечивает пользовательский интерфейс программы.

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

Когда у меня возникают проблемы с заполнениемBST.Когда я пытаюсь заполнить дерево, я получаю сообщение об ошибке «несовместимые типы: Строка не может быть преобразована в KeyedItem». Как изменить класс KeyedItem, чтобы он работал?Кроме того, если я смогу преодолеть проблемы KeyedItem, будет ли кода, который я написал в классе Menu, достаточно для заполнения BST?Я знаю, что здесь много информации;Заранее благодарю за любую помощь, которую вы можете мне оказать.

Вот мои классы:

Класс меню:

public static void main(String[]args) throws IOException{

    String read = "";

PhoneBook btree = new PhoneBook(); //creates bst object from phonebook class

    BufferedReader input = new BufferedReader(new FileReader("names.txt"));

        for (int i=0; i<5; i++){



            read = input.readLine(); //reads each lin of text file and stores it in var read




        }

        btree.insert(read); //this is where I get the ERROR message           

}

}

Класс поиска KeyedItem:

public abstract class KeyedItem<KT extends Comparable<? super KT>> {

private KT searchKey;

public KeyedItem(KT key){  //constructor
    searchKey = key;
}

Класс телефонной книги:

public class PhoneBook<T extends KeyedItem<KT>, KT extends Comparable<?     super KT>> extends BinaryTreeBasis<T> {

public PhoneBook(){

}
public PhoneBook(T rootItem){
    super(rootItem);
}

public void setRootItem(T newItem)   //I believe this class is not always used
        throws UnsupportedOperationException {
    throw new UnsupportedOperationException();

}

public void insert(T newItem){
    root = insertItem(root, newItem);

}

public T retrieve(KT searchKey){
    return retrieveItem(root, searchKey);
} 

public void delete(KT searchKey) throws TreeException{
    root = deleteItem(root, searchKey);
}

public void delete(T item) throws TreeException{
    root = deleteItem(root, item.getKey());
}

protected TreeNode<T> insertItem(TreeNode<T> tNode, T newItem){
    TreeNode<T> newSubtree;
    if(tNode == null){
        tNode = new TreeNode<T>(newItem, null, null);
        return tNode;
    }

    T nodeItem = tNode.item;

    if(newItem.getKey().compareTo(nodeItem.getKey()) < 0) {
        newSubtree = insertItem(tNode.leftChild, newItem);
        tNode.leftChild = newSubtree;
        return tNode;
    }
    else {
       newSubtree = insertItem(tNode.rightChild, newItem);
       tNode.rightChild = newSubtree;
       return tNode;
    }
}
    protected T retrieveItem (TreeNode<T> tNode, KT searchKey) {

        T treeItem;
        if(tNode == null){
            treeItem = null;
        }
        else {
            T nodeItem = tNode.item;
            if (searchKey.compareTo(nodeItem.getKey()) == 0) {
            treeItem = tNode.item;
        }
        else if (searchKey.compareTo(nodeItem.getKey()) < 0){
            treeItem = retrieveItem(tNode.leftChild, searchKey);
        }   

        else {
            treeItem = retrieveItem(tNode.rightChild, searchKey);
        }  
    }
    return treeItem;    
}

protected TreeNode<T> deleteItem(TreeNode<T> tNode, KT searchKey) {
    TreeNode<T> newSubtree;
    if (tNode == null){
        throw new TreeException("TreeException: Item not found");
    }
    else{
        T nodeItem = tNode.item;
        if (searchKey.compareTo(nodeItem.getKey()) == 0){
            tNode = deleteNode(tNode);
        }
        else if (searchKey.compareTo(nodeItem.getKey()) < 0){
            newSubtree = deleteItem(tNode.leftChild, searchKey);
            tNode.leftChild = newSubtree;
        }
        else {
            newSubtree = deleteItem(tNode.rightChild, searchKey);
            tNode.rightChild = newSubtree;
        }    

        }
    return tNode;
}    

protected TreeNode<T> deleteNode(TreeNode<T> tNode){
    T replacementItem;

    if((tNode.leftChild == null) &&
            (tNode.rightChild == null)){
        return null;
    }

    else if (tNode.leftChild == null){
        return tNode.rightChild;
    }

    else if (tNode.rightChild == null){
        return tNode.leftChild;
    }

    else { 

        replacementItem = findLeftmost(tNode.rightChild);
        tNode.item = replacementItem;
        tNode.rightChild = deleteLeftmost(tNode.rightChild);
        return tNode;
    }
}

protected T findLeftmost(TreeNode<T> tNode){
    if (tNode.leftChild == null) {
        return tNode.item;
    }
    else {
        return findLeftmost(tNode.leftChild);
    }        
}

protected TreeNode<T> deleteLeftmost(TreeNode<T> tNode){
    if (tNode.leftChild == null){
        return tNode.rightChild;
    }
    else{
        tNode.leftChild = deleteLeftmost(tNode.leftChild);
        return tNode;    
    }
}
}
    public KT getKey(){
    return searchKey;
}
}

Класс Person:

public class Person extends KeyedItem<String>{

private FullName name;
private String phoneNumber;


public Person(String id, FullName name, String phone){ //constructor

    super(id);
    this.name = name;
    phoneNumber = phone;


}

public String toString(){
    return getKey() + " # " + name;
}
}

Класс TreeNode:

public class TreeNode<T> {

T item;
TreeNode<T> leftChild;
TreeNode<T> rightChild;

public TreeNode(T newItem){ //constructor

    item = newItem;
    leftChild = null;
    rightChild = null;
}

public TreeNode(T newItem, TreeNode<T> left, TreeNode<T> right){

    item = newItem;
    leftChild = left;
    rightChild = right;
}

}

Класс BinaryTreeBasis:

public abstract class BinaryTreeBasis<T> {

protected TreeNode<T> root;

public BinaryTreeBasis(){  //default constructor

    root = null;
}

public BinaryTreeBasis(T rootItem){

    root = new TreeNode<T>(rootItem, null, null);
}

public boolean isEmpty(){

    return root == null;
}

public void makeEmpty(){

    root = null;
}

public T getRootItem() throws TreeException {

    if (root == null){
        throw new TreeException("Tree Exception: Empty Tree");
    }
    else{
        return root.item;
    }
}

public abstract void setRootItem(T newItem);

}

Полное имя класса:

public class FullName implements java.lang.Comparable<Object>{ //change from object?
private String firstName;
private String lastName;

public FullName(String first, String last){
    firstName = first;
    lastName = last;
}
    public int compareTo(Object rhs){

    FullName other = (FullName)rhs;

    if(lastName.compareTo(((FullName)other).lastName)==0){
        return firstName.compareTo(((FullName)other).firstName);
    }
    else {
        return lastName.compareTo(((FullName)other).lastName);
    }
}

}

Класс Tree Iterator:

public class TreeIterator<T> implements java.util.Iterator<T> {
private BinaryTreeBasis<T> binTree;
private TreeNode<T> currentNode;
private LinkedList <TreeNode<T>> queue;

public TreeIterator(BinaryTreeBasis<T> bTree){
    binTree = bTree;
    currentNode = null;
    queue = new LinkedList <TreeNode<T>>();
}

public boolean hasNext(){
    return !queue.isEmpty();               
}

public T next()
        throws java.util.NoSuchElementException{
    currentNode = queue.remove();
    return currentNode.item;
}

public void remove()
        throws UnsupportedOperationException{
    throw new UnsupportedOperationException();
}

public void setPreorder(){
    queue.clear();
    preorder(binTree.root);
}

public void setInorder(){
    queue.clear();
    inorder(binTree.root);
}

public void setPostorder(){
    queue.clear();
    postorder(binTree.root);
}

private void preorder(TreeNode<T> treeNode){
    if(treeNode != null){
        queue.add(treeNode);
        preorder(treeNode.leftChild);
        preorder(treeNode.rightChild);
    }
}

private void inorder(TreeNode<T> treeNode){
    if(treeNode != null){
        inorder(treeNode.leftChild);
        queue.add(treeNode);
        inorder(treeNode.rightChild);
    }
}

private void postorder(TreeNode<T> treeNode){
    if(treeNode != null){
        postorder(treeNode.leftChild);
        postorder(treeNode.rightChild);
        queue.add(treeNode);
    }
}

}
...