[英]not able to use the comparator in my program
在這個程序中它沒有識別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
異常
從文檔 :
基於TreeMap的NavigableSet實現。 元素按照其自然順序排序 ,或者在創建時創建時提供的比較器,具體取決於使用的構造函數。
強調我的。
您可能認為通過了Comparator
,因此不使用自然順序。 但在這一行
treeSet = build.sendAsTreeSet();
覆蓋剛剛在上一行中創建的treeSet
。 該樹集很可能沒有Comparator
集。
有兩種方法可以解決這個問題:
build
具有Comparator
集(根據您的意見,使用new TreeSet(new Compared())
該方法)。 build
返回的樹集中的元素實現Comparable
。 既然你用了
TreeSet treeSet = new TreeSet();
在您的sendAsTreeSet
方法中,樹集嘗試使用自然順序對添加的元素進行排序 。 Witch對你的對象類進行了侮辱,實現了Compareable接口。
你應該用那個替換那一行
TreeSet treeSet = new TreeSet( new Compared());
可以刪除main方法中的相同行。
我想這是
implements Comparable
所以只需將其更改為正確的界面即可
BuildObject build = new BuildObject();
TreeSet treeSet = new TreeSet( new Compared());
treeSet = build.sendAsTreeSet();
如果sendAsTreeSet
方法返回SA 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;
}
}
當您將集合覆蓋或添加到集合(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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.