当前位置: 首页 > 知识库问答 >
问题:

如何比较自定义树集实现中的两个对象?

拓拔麒
2023-03-14

我需要比较insert方法中的两个对象。但我无法弄清楚在哪里以及如何实现可比或比较器。我的代码如下所示:

这是我为二叉树创建的节点。

Node.java

public class Node {

private Object data;
private Node left, right;

//initial case when a Node of a binary tree gets created. both left and right subtrees point to   null
public Node (){

    left = right = null;
}

public Object getData() {
    return data;
}

public void setData(Object data) {
    this.data = data;
}

public Node getLeft() {
    return left;
}

public void setLeft(Node left) {
    this.left = left;
}

public Node getRight() {
    return right;
}

public void setRight(Node right) {
    this.right = right;
}

}
MyBinaryTree.java

public class MyBinaryTree implements Comparable<Node> {

Node root;

public MyBinaryTree(){
    root = null;
}

void insert(Object x){

    Node newrec = new Node();  //Node constructor gets called and sets up a root node with empty
    //subtrees
    newrec.setData(x);

    if(root == null){
        root = newrec;
    }
    else{
        Node a,b;
        a = b = root;
        while(a!=null){
            b=a;   
            if( ( newrec.getData() ).compareTo( a.getData() ) ) {
            }
        }

    }

}

void inorder(Node root){

}

@Override
public int compareTo(Node o) {
    // TODO Auto-generated method stub
    int i = (o.)
    return 0;
}


}

共有1个答案

哈沛
2023-03-14

您不仅需要能够比较节点,还需要能够比较这些节点中包含的数据。这意味着您的节点需要限制为接受可比的对象,或者您的树需要接受一个比较器来比较它们。

如果您真的想同时支持这两种方法,那么在进行比较时,如果提供了比较器,则使用其compare方法,否则将数据强制转换为carable ,其中E是节点数据的类型(见下文),然后使用它的compareto方法。

这就引出了下一点。您的节点类可能不应该简单地包含对象作为其数据,而是声明为节点 实现可比较的 >, ,然后您的树可以声明为MyBinaryTree 我还将更改节点的构造函数,以将数据作为参数,而不是在创建setter后立即调用setter。您没有理由要创建一个没有数据节点

我强烈建议通过源代码查看JDK附带的java.util包中的一些泛型集合。特别是,我参考了treemap.java的源代码,以了解它们是如何处理可比较元素和不可比较元素的,因为该类的声明方式并不要求元素具有可比性。(如果不是,并且没有比较器,尝试将对象强制转换为可比 时,将出现ClassCastException。)看看他们是如何实现类似代码的,将对您有很大帮助。您可能还想回顾一下Java泛型。

 类似资料:
  • 我试着选一个段落,通过打印出前三个单词来找到它的“意义”。去掉所有语法单词和空白后,我使用Hashmap计算每个单词的出现次数。然后,由于我不知道更好的方法,我只是创建了自己的小自定义对象来存储单词、键和出现次数、值,就像Hashmap一样,但我的老师建议实现Comparable,但我遇到了一个问题。我有两个问题,一个在我“修复”另一个时出现。问题在于Pair类中的compareTo函数和另一个类

  • 问题内容: 我有两个从同一类实例化的java对象。 如果我将它们的两个属性都设置为完全相同的值,然后验证它们是否相同 但是,这些方法都不返回真实值。我已经检查了每个属性,并且它们匹配。 如何比较这两个对象以验证它们是否相同? 问题答案: 你需要提供自己的实现。 如果哈希表中有可能使用你的对象,则还应该重写。一个合理的实施将是该对象的字段的哈希码喜欢的东西结合起来:

  • 我有以下代码: 现在,我有两个房屋列表和,这两个列表都填充了相同的房屋元素,但是嵌套的列表房屋任务在newHouse中更新了一个额外的任务。 如何获得一个新的列表,该列表包含通过Java8流添加的任务? 这一直在破坏我的大脑,我似乎无法让它工作。

  • 我试图解决以下leetcode问题: 给定一个排序数组,两个整数k和x,查找数组中与x最近的k个元素。结果也应该按升序排序。如果有一个领带,较小的元素总是首选。 示例1:输入:[1,2,3,4,5],k=4,x=3 产出:[1,2,3,4] 示例2:输入:[1,2,3,4,5],k=4,x=-1 产出:[1,2,3,4] 目前我的错误解决方案如下: 问题在于我传递给构造函数的比较器。其思想是,我希

  • 这是我的JSON文件。我只是不知道如何将对象PAV-001中的这个随机字符串()与node.js中的PAV-002中的所有这类字符串进行比较。只是想知道他们是否平等。谢谢!

  • 问题内容: 看一下PHP文档,对象的以下两种方法似乎都可以解决我的问题: DateTime :: diff]:获取差异并使用该差异确定哪个更古老。 DateTime :: getTimestamp:获取UNIX时间戳并进行比较。 这两种方法在doco中都标记为在版本>=5.3中可用(并且毫不奇怪,如果我尝试调用它们,我会发现它们不存在)。我找不到5.2.8的任何特定文档,所以不确定我的版本中是否有