无法在我的程序中使用比较器

时间:2013-07-31 09:21:39

标签: java comparator treeset

在此计划中,它无法识别compartor,我不想使用compareTo

class TestTreeSet
{
    public static void main(String args[])
    {
        BuildObject build = new BuildObject();
        TreeSet treeSet = new TreeSet( new Compared());
        treeSet = build.sendAsTreeSet();
        Iterator itr = treeSet.iterator();
        while(itr.hasNext())
        {
            Obj object = (Obj) itr.next();
            System.out.println(object.getName() + "\n " + object.getAge() + "\n "
                 + object.getSalary());
        }
    }
}

这是比较器

class Compared implements Comparator
{
    public int compare(Object a , Object b)
    {
        Obj one = (Obj) a;
        Obj two = (Obj) b;
        double salaryOne = one.getSalary();
        double salaryTwo = two.getSalary();
        int ageOne = one.getAge();
        int ageTwo = two.getAge();
        if( ageOne == ageTwo)
        {
            if(salaryOne > salaryTwo)
            {
                return -1;
            }
            else if(salaryOne < salaryTwo)
            {
                return 1;
            }
            else return 0;
        }
        else if(ageOne > ageTwo)
        return -1;
        else return 1;
    }
}

有什么问题?它显示无法转换为java.lang.comparable例外

5 个答案:

答案 0 :(得分:1)

来自documentation

  

基于TreeMap的NavigableSet实现。元素按照使用它们的自然顺序进行排序,或者在创建时设置的比较器中进行排序,具体取决于使用的构造函数。

强调我的。

您可能认为传递了Comparator,因此不使用自然顺序。但是在这一行

treeSet = build.sendAsTreeSet();

您将覆盖刚刚在上一行中创建的treeSet。该树集很可能没有设置Comparator

有两种方法可以解决这个问题:

  1. 确保build返回的树集具有Comparator集(根据您的评论,在该方法中使用new TreeSet(new Compared()))。
  2. 确保build返回的树集中的元素实现Comparable

答案 1 :(得分:1)

因为你使用

TreeSet treeSet = new TreeSet();

sendAsTreeSet方法中,树集会尝试使用theire natural ordering对添加的元素进行排序。 Witch将你的对象类强行实现Compareable接口。

您应该用

替换该行
TreeSet treeSet = new TreeSet( new Compared());

可以删除main方法中的同一行。

答案 2 :(得分:0)

我认为它

implements Comparable

所以只需将其更改为正确的界面

答案 3 :(得分:0)

BuildObject build = new BuildObject();
TreeSet treeSet = new TreeSet( new Compared());
treeSet = build.sendAsTreeSet();

如果sendAsTreeSet方法返回包含TreeSet类对象的sa Obj,那么您可以更改ComparedClass如下,我希望它能正常工作。

class Compared implements Comparator
{
public int compare(Obj a , Obj b)
{

    double salaryOne = a.getSalary();
    double salaryTwo = b.getSalary();
    int ageOne = a.getAge();
    int ageTwo = b.getAge();
    if( ageOne == ageTwo)
    {
        if(salaryOne > salaryTwo)
        {
            return -1;
        }
        else if(salaryOne < salaryTwo)
        {
            return 1;
        }
        else return 0;
    }
    else if(ageOne > ageTwo)
    return -1;
    else return 1;
}
}

答案 4 :(得分:0)

当您将集合覆盖或添加到集合(Treeset)时,您需要使用后面集合中使用的比较器来实现可比较的元素或类。

尝试在元素类上实现可比性,如下所示

class Person implements Comparable{

  @Override
  public int compareTo(Object arg0) {
    return -1;
  }
}

而是通过

分配参考
treeSet = build.sendAsTreeSet(); 

使用以下的addAll

treeSet.addAll(build.sendAsTreeSet()); 

希望将为你工作。如果它不起作用,请告诉我

检查以下示例

public class ComparatorTest {
    public static void main(String[] args) {

        TreeSet<Person> treeSet = new TreeSet<Person>(new Comparator());
        treeSet.addAll(new BuildObject().sendAsTreeSet());
        Iterator<Person> itr = treeSet.iterator();
        while(itr.hasNext())
        {
            Person itrObject =  itr.next();
            System.out.println("Name: "+itrObject.getName()+"\n Age: "+itrObject.getAge() + "\n Salary: " + itrObject.getSalary());
        }
    }
}

class Comparator implements java.util.Comparator<Person> {
    @Override
    public int compare(Person one, Person two) {
        double salaryOne = one.getSalary();
        double salaryTwo = two.getSalary();
        int ageOne = one.getAge();
        int ageTwo = two.getAge();
        if (ageOne == ageTwo) {
            if (salaryOne > salaryTwo) {
                return -1;
            } else if (salaryOne < salaryTwo) {
                return 1;
            } else
                return 0;
        } else if (ageOne > ageTwo)
            return -1;
        else
            return 1;
    }
}

class BuildObject{
    public TreeSet<Person> sendAsTreeSet(){
        Person object = new Person();
        object.setName("Pritesh");
        object.setAge(20);
        object.setSalary(1000);

        Person object2 = new Person();
        object2.setName("Joe");
        object2.setAge(19);
        object2.setSalary(3000);

        Person object3 = new Person();
        object3.setName("Blogg");
        object3.setAge(20);
        object3.setSalary(4000);

        TreeSet<Person> treeSet =  new TreeSet<Person>();
        treeSet.add(object);
        treeSet.add(object2);
        treeSet.add(object3);
        return treeSet;
    }
}

class Person implements Comparable{
    private String name;
    private int age;
    private int salary;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    @Override
    public int compareTo(Object arg0) {
        return -1;
    }
}