2016-08-12 1 views
-1

Итак, у меня есть последний в понедельник в Java, и в классе мы перешли на generics, и я подумал, что это выглядит просто. Я хотел попробовать это, используя пример из книги. Поэтому я пытаюсь создать родовое дерево. Дело в том, что мой код почти одинаково похож на примеры, используемые в классе, за исключением того, что мой не будет работать. Я довольно смущен, почему. Он говорит мне, что мне не хватает идентификатора в методе insert. Но, как я уже сказал, это выглядит как идеальная смесь между тем, что сделал профессор, и примером книг. Я попытался найти ответы на другие вопросы о дженериках, но я просто стал более смущенным. Возможно ли кому-то в простых терминах (в пределах разумного) объяснить мне, что я делаю неправильно? Если ваши интересно на какой учебник это Java Как программа по Deitel и DeitelJava Generic Tree Comparable

// Tree.java 
// Definition of class TreeNode and class Tree. 
// class TreeNode definition 
class TreeNode<E extends Comparable<TreeNode<E>>> 
{ 

    TreeNode<E> leftNode; // left node 
    E data; // node value 
    TreeNode<E> rightNode; // right node 

    // constructor initializes data and makes this a leaf node 
    public TreeNode(E nodeData) 
    { 
     data = nodeData;    
     leftNode = rightNode = null; // node has no children 
    } // end TreeNode constructor 

    // locate insertion point and insert new node; ignore duplicate values 
    public void <E extends Comparable<TreeNode<E>>> insert(E insertValue) 
    { 
     // insert in left subtree 
     if (data.compareTo(insertValue) > 0) 
     { 
     // insert new TreeNode 
     if (leftNode == null) 
      leftNode = new TreeNode<E>(insertValue); 
     else // continue traversing left subtree 
      leftNode.insert(insertValue); 
     } // end if 
     else if (data.compareTo(insertValue) < 0) // insert in right subtree 
     { 
     // insert new TreeNode 
     if (rightNode == null) 
      rightNode = new TreeNode<E>(insertValue); 
     else // continue traversing right subtree 
      rightNode.insert(insertValue); 
     } // end else if 
    } // end method insert 
} // end class TreeNode 

// class Tree definition 
public class Tree<E> 
{ 
    private TreeNode<E> root; 

    // constructor initializes an empty Tree of integers 
    public Tree() 
    { 
     root = null; 
    } // end Tree no-argument constructor 

    // insert a new node in the binary search tree 
    public void insertNode(E insertValue) 
    { 
     if (root == null) 
     root = new TreeNode<E>(insertValue); // create the root node here 
     else 
     root.insert(insertValue); // call the insert method 
    } // end method insertNode 

    // begin preorder traversal 
    public void preorderTraversal() 
    { 
     preorderHelper(root); 
    } // end method preorderTraversal 

    // recursive method to perform preorder traversal 
    private void preorderHelper(TreeNode<E> node) 
    { 
     if (node == null) 
     return; 

     System.out.printf("%d ", node.data); // output node data 
     preorderHelper(node.leftNode);  // traverse left subtree 
     preorderHelper(node.rightNode);  // traverse right subtree 
    } // end method preorderHelper 

    // begin inorder traversal 
    public void inorderTraversal() 
    { 
     inorderHelper(root); 
    } // end method inorderTraversal 

    // recursive method to perform inorder traversal 
    private void inorderHelper(TreeNode<E> node) 
    { 
     if (node == null) 
     return; 

     inorderHelper(node.leftNode);  // traverse left subtree 
     System.out.printf("%d ", node.data); // output node data 
     inorderHelper(node.rightNode);  // traverse right subtree 
    } // end method inorderHelper 

    // begin postorder traversal 
    public void postorderTraversal() 
    { 
     postorderHelper(root); 
    } // end method postorderTraversal 

    // recursive method to perform postorder traversal 
    private void postorderHelper(TreeNode<E> node) 
    { 
     if (node == null) 
     return; 

     postorderHelper(node.leftNode);  // traverse left subtree 
     postorderHelper(node.rightNode);  // traverse right subtree 
     System.out.printf("%d ", node.data); // output node data 
    } // end method postorderHelper 
} // end class Tree 

Это мой класс драйвера, который является фрагментом книги используется в качестве примера:

// This program tests class Tree. 
import java.util.Random; 

public class TreeTest 
{ 
    public static void main(String args[]) 
    { 
     Tree tree = new Tree<E>(); 
     E value; 
     Random randomNumber = new Random(); 

     System.out.println("Inserting the following values: "); 

     // insert 10 random integers from 0-99 in tree 
     for (int i = 1; i <= 10; i++) 
     { 
     value = randomNumber.nextInt(100); 
     System.out.print(value + " "); 
     tree.insertNode(value); 
     } // end for 

     System.out.println ("\n\nPreorder traversal"); 
     tree.preorderTraversal(); // perform preorder traversal of tree 

     System.out.println ("\n\nInorder traversal"); 
     tree.inorderTraversal(); // perform inorder traversal of tree 

     System.out.println ("\n\nPostorder traversal"); 
     tree.postorderTraversal(); // perform postorder traversal of tree 
     System.out.println(); 
    } // end main 
} // end class TreeTest 
+1

Пробовали ли вы не используете ' E' в main()? Как с помощью 'Integer'instead? – Shark

+0

Когда вы создаете экземпляр 'Tree', вам нужно сказать, какой тип' E' будет. – jr593

+0

Упс! Исходный тип: 'Tree tree = new Tree ();'. Try 'Tree tree = новое дерево ();' – Bohemian

ответ

1

Есть несколько заметных ошибок в вашей реализации.

Прежде всего, определение типа вашего TreeNode и Tree классов представляется ошибочным. TreeNode имеют тип E и E должны быть сопоставимыми (т.е. Реализует интерфейс Comparable<E>.

Поэтому я думаю, вы должны определить свой TreeNode и Tree класс следующим образом.

class TreeNode<E extends Comparable<E>> { 
    //other code 
} 

public class Tree<E extends Comparable<E>> { 
    //other code 
} 

Затем, когда вы используете Tree следует указать фактический общий тип.

в качестве примера вы можете использовать свое дерево следующим образом.

Tree tree = new Tree<Integer>(); 
tree.insertNode(100); 
tree.insertNode(200); 
tree.insertNode(150); 
tree.preorderTraversal(); 
0

Следующая строка неправильно

public void <E extends Comparable<TreeNode<E>>> insert(E insertValue) 

должно быть

public <E extends Comparable<TreeNode<E>>> void insert(E insertValue) 

вместо этого, но это не решит все ваши проблемы. Правильный класс TreeNode должен выглядеть следующим образом

class TreeNode<E extends Comparable<E>> { 

    TreeNode<E> leftNode; // left node 
    E data; // node value 
    TreeNode<E> rightNode; // right node 

    // constructor initializes data and makes this a leaf node 
    public TreeNode(E nodeData) { 
     data = nodeData; 
     leftNode = rightNode = null; // node has no children 
    } // end TreeNode constructor 

    // locate insertion point and insert new node; ignore duplicate values 
    public void insert(E insertValue) { 
     // insert in left subtree 
     if (data.compareTo(insertValue) > 0) { 
      // insert new TreeNode 
      if (leftNode == null) 
       leftNode = new TreeNode<E>(insertValue); 
      else // continue traversing left subtree 
       leftNode.insert(insertValue); 
     } // end if 
     else if (data.compareTo(insertValue) < 0) // insert in right subtree 
     { 
      // insert new TreeNode 
      if (rightNode == null) 
       rightNode = new TreeNode<E>(insertValue); 
      else // continue traversing right subtree 
       rightNode.insert(insertValue); 
     } // end else if 
    } // end method insert 
} // end class TreeNode 

Вы также должны изменить определение класса для дерева к

public class Tree<E extends Comparable<E>> { 
0

Основной ошибкой является:

public void <E extends Comparable<TreeNode<E>>> insert(E insertValue) 

, который определяет новый общий параметр E только для метода. Это должно быть только:

public void insert(E insertValue) 

Тогда:

Tree<Integer> tree = new Tree<>(); 

обеспечивая фактический обобщенный тип аргумента Tree.


BTW немного короче (меньше new s) будет:

Дерево:

public void insertNode(E insertValue) 
{ 
    root = insert(root, insertValue); 
} 

TreeNode:

public static TreeNode<E> insert(TreeNode<E> node, E insertValue) 
{ 
    if (node == null) 
    { 
     return new TreeNode<E>(insertValue); 
    } 
    if (data.compareTo(insertValue) > 0) 
    { 
     node.leftNode = insert(node.leftNode, insertValue); 
    } 
    else if (data.compareTo(insertValue) < 0) 
    { 
     node.rightNode = insert(node.rightNode, insertValue); 
    } 
    return node; 
}