как вы сравниваете объект с сопоставимым? - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть назначение класса, где мне нужно отсортировать цель в узел двоичного дерева, где дано root, мне нужно сравнить его с root и поставить цель как левого потомка, если цель меньше значения root, либо ставьте цель как правый дочерний элемент, если цель больше значения root.

Я должен использовать заголовок метода и аргументы, как указано, и я написал свой код следующим образом:

   public static boolean find(TreeNode t, Comparable x)
   {
      TreeNode p = t;
      if(t == null)
         return false;
      while(p != null)
      {
         if(p.getValue() == x)
            return true;
         else if(p.getValue() < x)
            p = p.getLeft();
         else
            p = p.getRight();
      }
      return false;
   }

, который возвращает эту ошибку:

BinarySearchTree. java: 109: ошибка: неверные типы операндов для двоичного оператора '<' </p>

Я также попробовал метод CompareTo, попробовав что-то вроде

if(p.getValue().compareTo(x) == 0)
   return true;

, который возвращает ошибку ниже:

BinarySearchTree. java: 107: ошибка: не удается найти символ if (p.getValue () .compareTo (x)) ^ символ: метод compareTo (Comparable) расположение: класс Объект

Как я могу исправить эту ошибку? Я пытался найти эту проблему, но это не особо помогло.

UPDATE - класс TreeNode:

class TreeNode 
{
   private Object value; 
   private TreeNode left, right;
   
   public TreeNode(Object initValue)
   { 
      value = initValue; 
      left = null; 
      right = null; 
   }
   
   public TreeNode(Object initValue, TreeNode initLeft, TreeNode initRight)
   { 
      value = initValue; 
      left = initLeft; 
      right = initRight; 
   }
   
   public Object getValue()
   { 
      return value; 
   }
   
   public TreeNode getLeft() 
   { 
      return left; 
   }
   
   public TreeNode getRight() 
   { 
      return right; 
   }
   
   public void setValue(Object theNewValue) 
   { 
      value = theNewValue; 
   }
   
   public void setLeft(TreeNode theNewLeft) 
   { 
      left = theNewLeft;
   }
   
   public void setRight(TreeNode theNewRight)
   { 
      right = theNewRight;
   }
}

1 Ответ

0 голосов
/ 27 февраля 2020

Похоже, x ваш Comparable интерфейс. Вы должны вызвать метод compareTo для этого параметра, а затем сравнить результат с 0. У Comparable Javado c есть несколько примеров использования. Функция compareTo возвращает:

отрицательное целое число, ноль или положительное целое число, поскольку этот объект меньше, равен или больше указанного объекта.

Причина, по которой вы получаете свои ошибки, заключается в том, что сначала вы пытались применить < к несовместимым типам. p.getValue() возвращает вам Object, тогда как x - это Comparable (обычно вы должны применять этот оператор к примитивам, таким как int, long, et c.).

Вторая ошибка заключалась в том, что даже если у объекта p.getValue() есть метод compareTo, вы должны быть осторожны с тем, с каким другим объектом вы сравниваете. Например, если это строка, вы можете сравнить ее только с другой строкой, например, "str1".compareTo("str2");

Чтобы правильно сравнить ваши значения, вы должны сделать что-то вроде:

// checking if x is less than p's value
if (x.compareTo(p.getValue()) < 0) { ... }

// checking if x is greater than p's value
if (x.compareTo(p.getValue()) > 0) { ... }

// checking if x is equal to p's value
if (x.compareTo(p.getValue()) == 0) { ... }
...