Не может использовать компаратор в моей программе
В этой программе он не идентифицирует 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
задавать.
Есть два способа решить это:
- Убедитесь, что набор деревьев, возвращаемый
build
имеетComparator
установить (основываясь на вашем комментарии, используйтеnew TreeSet(new Compared())
в этом методе). - Убедитесь, что элементы в древовидной структуре возвращены
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;
}
}