代码之家  ›  专栏  ›  技术社区  ›  notaorb

使用泛型创建节点遍历类?

  •  0
  • notaorb  · 技术社区  · 1 年前

    有人知道解决这个问题的最佳方法吗?

    我得到了以下错误,我认为这意味着我需要一种不同的方法来比较节点的数据元素。

    java: bad operand types for binary operator '<'
      first type:  V
      second type: V
    

    密码

    class Node<V> {
        Node<V> left;
        Node<V> right;
        V data;
    
        public Node(V d) {
            left = null;
            right = null;
            data = d;
        }
    
        public void Insert(V d) {
            if (data != null) {
                if (d < data) {
                    if (left == null) {
                        left = Node(d);
                    } else {
                        left.Insert(d);
                    }
                }
            }
        }
    }
    
    2 回复  |  直到 1 年前
        1
  •  2
  •   dani-vta    1 年前

    正如@Dan W在评论中所建议的那样,泛型类型 V 在中 Node 类应该定义的上限 Comparable 以便限制可能的类型以代替 五、 只有那些可以 相比 (已订购)。

    在Java中,运算符 < , > , <= , >= 只能用于数字基元类型,例如 int , float , double ,等等。相反,要比较引用类型,它们的类需要实现 Comparable 接口来定义它们的元素之间的自然顺序。

    此接口对实现它的每个类的对象强制执行总排序。此排序被称为类的自然排序,类的compareTo方法被称为其自然比较方法。

    大多数Java类都喜欢 Integer , Float , Double 以及许多其他人已经实现了 可比较的 接口,而对于您自己的类,您需要在 compareTo 方法这里还有一篇很棒的文章,来自 Bealdung 以及如何实现的指南 可比较的 界面

    在您的情况下,类的通用版本 节点 可以通过以下方式重写:

    class Node<V extends Comparable<V>> {
    
        Node<V> left;
        Node<V> right;
        V data;
    
        public Node(V d) {
            left = null;
            right = null;
            data = d;
        }
    
        public void Insert(V d) {
            if (data != null) {
                if (d.compareTo(data) < 0) {
                    if (left == null) {
                        left = new Node<>(d);
                    } else {
                        left.Insert(d);
                    }
                }
            }
        }
    }
    
        2
  •  0
  •   Batman    1 年前

    您得到这个错误是因为编译器不知道 V 是支持与进行比较的类型 < 。您可以使用 compareTo() 方法来比较泛型类型元素。 Check this for more info .

    实例

    public void Insert(V d) {
            if (data != null) {
                if (d.compareTo(data) < 0) {
                    if (left == null) {
                        left = new Node<>(d);
                    } else {
                        left.Insert(d);
                    }
                }
            }
    }