在此计划中,它无法识别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
例外
答案 0 :(得分:1)
基于TreeMap的NavigableSet实现。元素按照使用它们的自然顺序进行排序,或者在创建时设置的比较器中进行排序,具体取决于使用的构造函数。
强调我的。
您可能认为传递了Comparator
,因此不使用自然顺序。但是在这一行
treeSet = build.sendAsTreeSet();
您将覆盖刚刚在上一行中创建的treeSet
。该树集很可能没有设置Comparator
。
有两种方法可以解决这个问题:
build
返回的树集具有Comparator
集(根据您的评论,在该方法中使用new TreeSet(new Compared())
)。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;
}
}