簡體   English   中英

無法在我的程序中使用比較器

[英]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集。

有兩種方法可以解決這個問題:

  1. 確保返回的TreeSet的build具有Comparator集(根據您的意見,使用new TreeSet(new Compared())該方法)。
  2. 確保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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM