我需要在树集中的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;
}
}
答案 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;
}
}