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

时间:2013-10-18 16:42:18

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

我需要在树集中的insert方法中比较两个对象。但我无法理解在哪里以及如何实现Comparable或Comparator。我的代码如下:

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

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类:

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() ) ) {

我被困在这里!我如何使用Comparable比较这些对象?

            }
        }

    }

}

void inorder(Node root){

}

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


}

2 个答案:

答案 0 :(得分:2)

您需要能够比较节点,而不仅仅是节点中包含的数据。这意味着您的Node需要仅限于使用Comparable,的对象,或者您的树需要使用可用于比较它们的Comparator

如果你真的想同时支持这两者,那么当需要进行比较时,如果提供了Comparator,请使用其比较方法,否则将数据转换为Comparable<? super E>,其中E是Node数据的类型(见下文),然后使用其compareTo方法。

这让我想到了下一点。您的Node类可能不仅仅包含Object作为其数据,而是声明为Node<E> implements Comparable<Node<E>>,,然后您的树可以声明为MyBinaryTree<E>.我也会更改构造函数for Node将数据作为参数,而不是在创建一个后立即调用setter。您没有理由想要创建没有数据的Node

我强烈建议查看JDK附带的java.util包中的一些泛型集合的源代码。特别是,我提到了TreeMap.java的来源,看看它们如何处理Comparable和Non-Comparable元素,因为类没有以要求元素为Comparable的方式声明。 (如果不是,并且没有Comparator, ClassCastException会在他们尝试将对象强制转换为Comparable<? super K>时发生。)看看他们如何实现类似的代码将是一个伟大的帮助你。您可能还想查看Java泛型。

答案 1 :(得分:0)

请参阅以下代码

package com.example.treeset;

import java.util.Comparator;
import java.util.TreeSet;

public class MyCompUser {

    public static void main(String a[]){
        //By using name comparator (String comparison)
        TreeSet<Empl> nameComp = new TreeSet<Empl>(new MyNameComp());
        nameComp.add(new Empl("Ram",3000));
        nameComp.add(new Empl("John",6000));
        nameComp.add(new Empl("Crish",2000));
        nameComp.add(new Empl("Tom",2400));
        for(Empl e:nameComp){
            System.out.println(e);
        }
        System.out.println("===========================");
        //By using salary comparator (int comparison)
        TreeSet<Empl> salComp = new TreeSet<Empl>(new MySalaryComp());
        salComp.add(new Empl("Ram",3000));
        salComp.add(new Empl("John",6000));
        salComp.add(new Empl("Crish",2000));
        salComp.add(new Empl("Tom",2400));
        for(Empl e:salComp){
            System.out.println(e);
        }
    }
}

class MyNameComp implements Comparator<Empl>{

    @Override
    public int compare(Empl e1, Empl e2) {
        return e1.getName().compareTo(e2.getName());
    }
}   

class MySalaryComp implements Comparator<Empl>{

    @Override
    public int compare(Empl e1, Empl e2) {
        if(e1.getSalary() > e2.getSalary()){
            return 1;
        } else {
            return -1;
        }
    }
}

class Empl{

    private String name;
    private int salary;

    public Empl(String n, int s){
        this.name = n;
        this.salary = s;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getSalary() {
        return salary;
    }
    public void setSalary(int salary) {
        this.salary = salary;
    }
    public String toString(){
        return "Name: "+this.name+"-- Salary: "+this.salary;
    }
}