为什么我不能在比较二叉搜索树中节点的键与0时使用 .compareTo() 方法?

huangapple go评论81阅读模式
英文:

Why can I not use .compareTo() when comparing the key of a a node in a BST to 0?

问题

  • 这并不是类中包含的全部代码,但如果这还不够的话,我会添加剩下的部分。
  • add() 的作用是将值按照键添加到二叉搜索树的正确位置。如果键已经存在,则不执行任何操作。
  • contains() 应该在树中包含指定的键时返回 True。
{
    public Node left;
    public Node right;
    public int key;
    public String value;

    public void add ( int key, String value )
    {
        if ( key.compareTo ( this.key ) < 0)
        {
            if ( left != null )
                left.add ( key, value )
            else
                left = new Node ( key, value );
        }
        else if ( key.compareTo ( this.key ) > 0 )
        {
            if ( right != null )
                right.add ( key, value );
            else
                right = new Node ( key, value);
        }
        else
            this.value = value;
    }

    public boolean contains ( int key )
    {
        if ( this.key == ( key ) )
            return value;
        if ( key.compareTo ( this.key ) < 0 )
            return left == null ? null : left.contains ( key );
        else
            return right == null ? null : right.contains ( key );
    }
}
英文:
  • This is not all the code contained within the class, but if this is not enough I will add the rest as well.

  • add() is meant to add the value to the correct position in the BST using the key. If the key already exists, do nothing.

  • contains() is supposed to return True if the specified key is in the tree

     ```public class Node
     {
         public Node left;
         public Node right;
         public int key;
         public String value;
    
         public void add ( int key, String value )
         {
             if ( key.compareTo ( this.key ) &lt; 0)
             {
                 if ( left != null )
                     left.add ( key, value )
                 else
                     left = new Node ( key, value );
             }
             else if ( key.compareTo ( this.key ) &gt; 0 )
             {
                 if ( right != null )
                     right.add ( key, value );
                 else
                     right = new Node ( key, value);
             }
             else
                 this.value = value;
         }
    
         public boolean contains ( int key )
         {
             if ( this.key == ( key ) )
                 return value;
             if ( key.compareTo ( this.key ) &lt; 0 )
                 return left == null ? null : left.contains ( key );
             else
                 return right == null ? null : right.contains ( key );
         }
     }
    
    
    
    
    
    

答案1

得分: 2

问题在于 int 是原始类型,因此不实现 Comparable 接口,所以您不能使用 int.compareTo。然而,包装变量 Integer 则实现了 Comparable 接口。您可以简单地使用 Integer 替代 int,或者使用 Integer.compare(1, 2) 来保留原始类型的使用。

public static class Node {
    public Node left;
    public Node right;
    public Integer key;
    public String value;

    public Node(Integer key, String value) {
        this.key = key;
        this.value = value;
    }

    public void add(Integer key, String value) {
        if (key.compareTo(this.key) < 0) {
            if (left != null)
                left.add(key, value);
            else
                left = new Node(key, value);
        } else if (key.compareTo(this.key) > 0) {
            if (right != null)
                right.add(key, value);
            else
                right = new Node(key, value);
        } else
            this.value = value;
    }

    public boolean contains(Integer key) {
        if (this.key.intValue() == key) {
            return true;
        }
        if (key.compareTo(this.key) < 0)
            return left == null ? false : left.contains(key);
        else
            return right == null ? false : right.contains(key);
    }
}
英文:

The issue is that int is primitive and therefor does not implement Comparable so you cannot use int.compareTo, however the boxed variation Integer does. You can simply use Integer instead of int, or alternatively use Integer.compare(1, 2) and retain your usage of primitives.

public static class Node {
public Node left;
public Node right;
public Integer key;
public String value;
public Node(Integer key, String value) {
this.key = key;
this.value = value;
}
public void add(Integer key, String value) {
if (key.compareTo(this.key) &lt; 0) {
if (left != null)
left.add(key, value);
else
left = new Node(key, value);
} else if (key.compareTo(this.key) &gt; 0) {
if (right != null)
right.add(key, value);
else
right = new Node(key, value);
} else
this.value = value;
}
public boolean contains(Integer key) {
if (this.key.intValue() == (key)) {
return true;
}
if (key.compareTo(this.key) &lt; 0)
return left == null ? null : left.contains(key);
else
return right == null ? null : right.contains(key);
}
}

huangapple
  • 本文由 发表于 2020年4月5日 10:33:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/61037306.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定