【问题标题】:how do you compare an object with a comparable?您如何将对象与可比较对象进行比较?
【发布时间】:2020-02-27 11:49:49
【问题描述】:

我有一个类分配,我需要将一个目标排序到一个二叉树节点中,给定一个根,我需要将它与根进行比较,如果目标小于根的值,或者如果目标大于根的值,则将目标作为右孩子。

我必须使用给定的方法头和参数,并且我已经这样编写了我的代码:

   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:错误:二元运算符'的操作数类型错误

我也尝试了 compareTo 方法,通过尝试类似的东西

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

返回以下错误:

BinarySearchTree.java:107:错误:找不到符号 if(p.getValue().compareTo(x)) ^ 符号:方法 compareTo(Comparable) 位置:类对象

如何解决此错误?我试图搜索这个问题,但这并不是特别有用。

更新——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;
   }
}

【问题讨论】:

    标签: java tree binary-tree binary-search-tree comparable


    【解决方案1】:

    看起来x 是您的Comparable 接口。您应该在此参数上调用compareTo 方法,然后将结果与0 进行比较。 Comparable Javadoc 有一些使用示例。 compareTo 函数返回:

    负整数、零或正整数,因为此对象小于、等于或大于指定对象。

    您收到错误的原因是,起初您试图将&lt; 应用于不兼容的类型。 p.getValue() 返回一个Object,而x 是一个Comparable(通常您应该将此运算符应用于基元,例如int、long 等)。

    第二个错误是,即使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) { ... }
    

    【讨论】:

    • 哦!我忘了澄清,这是一个字符串树(虽然更像单字母字符),所以我认为它会自动有一个 compareTo。
    • 你能发布TreeNode类吗?这样就更容易看到发生了什么。
    • 您的方法确实有效,谢谢!不过好吧,我会更新原帖。
    • 如果它是一个字符串,您可以在其上使用.compareTo,但只能针对另一个字符串,而不是针对Comparable 对象。例如,"str1".compareTo("str2");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2012-01-21
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多