Не может использовать компаратор в моей программе

В этой программе он не идентифицирует 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 ответов

Так как вы используете

TreeSet treeSet = new TreeSet();

в вашем sendAsTreeSet метод, treeset пытается отсортировать элементы, добавленные с помощью их естественного упорядочения. Ведьма оскверняет класс ваших объектов и должна реализовывать интерфейс Compareable.

Вы должны заменить эту строку на

TreeSet treeSet = new TreeSet( new Compared());

Эту же строку в основном методе можно удалить.

Из документации:

Реализация NavigableSet, основанная на TreeMap. Элементы упорядочиваются с использованием их естественного упорядочения или с помощью компаратора, предоставляемого во время создания набора, в зависимости от того, какой конструктор используется.

Акцент мой.

Вы можете подумать, что вы проходите ComparatorТаким образом, естественный порядок не используется. Но в этой строке

treeSet = build.sendAsTreeSet();

Вы перезаписываете treeSet Вы только что создали в предыдущей строке. Этот набор деревьев, скорее всего, не имеет Comparator задавать.

Есть два способа решить это:

  1. Убедитесь, что набор деревьев, возвращаемый build имеет Comparator установить (основываясь на вашем комментарии, используйте new TreeSet(new Compared()) в этом методе).
  2. Убедитесь, что элементы в древовидной структуре возвращены build воплощать в жизнь Comparable,
BuildObject build = new BuildObject();
TreeSet treeSet = new TreeSet( new Compared());
treeSet = build.sendAsTreeSet();

Если sendAsTreeSet метод возврата s a TreeSet который содержит объект типа 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;
}
}

Я думаю, что это

implements Comparable

Так что просто нужно изменить его на правильный интерфейс

Когда вы переопределяете или добавляете коллекцию в коллекцию (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;
    }
}
Другие вопросы по тегам