1

二分探索木にオブジェクトを追加する必要があり、独自の compareTo メソッドを記述したいと考えています。これについてどうすればいいですか。実際、私はカスタム TreeSet を実装しようとしています。コンパレータまたは同等のものを実装して定義する場所がわかりません。どんな助けでも大歓迎

4

4 に答える 4

1

以下のコードを参照してください

package com.example.treeset;

    import java.util.Comparator;
    import java.util.TreeSet;

    public class MyCompUser {

        public static void main(String a[]){
            //By using name comparator (String comparison)
            TreeSet<Empl> nameComp = new TreeSet<Empl>(new MyNameComp());
            nameComp.add(new Empl("Ram",3000));
            nameComp.add(new Empl("John",6000));
            nameComp.add(new Empl("Crish",2000));
            nameComp.add(new Empl("Tom",2400));
            for(Empl e:nameComp){
                System.out.println(e);
            }
            System.out.println("===========================");
            //By using salary comparator (int comparison)
            TreeSet<Empl> salComp = new TreeSet<Empl>(new MySalaryComp());
            salComp.add(new Empl("Ram",3000));
            salComp.add(new Empl("John",6000));
            salComp.add(new Empl("Crish",2000));
            salComp.add(new Empl("Tom",2400));
            for(Empl e:salComp){
                System.out.println(e);
            }
        }
    }

    class MyNameComp implements Comparator<Empl>{

        @Override
        public int compare(Empl e1, Empl e2) {
            return e1.getName().compareTo(e2.getName());
        }
    }   

    class MySalaryComp implements Comparator<Empl>{

        @Override
        public int compare(Empl e1, Empl e2) {
            if(e1.getSalary() > e2.getSalary()){
                return 1;
            } else {
                return -1;
            }
        }
    }

    class Empl{

        private String name;
        private int salary;

        public Empl(String n, int s){
            this.name = n;
            this.salary = s;
        }

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getSalary() {
            return salary;
        }
        public void setSalary(int salary) {
            this.salary = salary;
        }
        public String toString(){
            return "Name: "+this.name+"-- Salary: "+this.salary;
        }
    }
于 2013-10-18T05:13:32.817 に答える
1

あなたのオブジェクトはインターフェースComparableを実装している必要があります

class MyClass implements Comparable { 
  int compareTo(){...}
}
final Set set = new TreeSet();
set.add(new MyClass());
....
set.add(new MyClass());

または独自のコンパレータを作成します。

class MyClass {}

class MyComparator implements Comparator {
    int compareTo(Object o1, Object o2){
      ...
    }
}
final Set set = new TreeSet(new MyComparator());
set.add(new MyClass());
....
set.add(new MyClass());
于 2013-10-18T05:14:15.810 に答える
1

TreeSet実装に追加するオブジェクトを確認する必要がありますComparable。これは、格納されたオブジェクトがJavadoccompareToで定義されているメソッドを実装していることを確認することを意味します。

おそらく必要ありませんComparator

ところで、私たちは最近、まさにこのトピックに関するチュートリアルを作成しました。うまくいけば、それはあなたを助けることができます.

于 2013-10-18T05:10:07.983 に答える
1

の場合TreeSet、インターフェースの独自の実装を提供する必要がありComparatorます。

もしかして、こういうこと?

// Using an anonymous interface
Set<Foobar> example = new TreeSet<Foobar>(new Comparator<Foobar>() {
  @Override
  public int compare(Foobar f1, Foobar f2) {
    // How will you compare f1 and f2??
    return 0;
  }

  @Override
  public boolean equals(Object obj) {
    // How will you determine if objects are equal?
    return false;
  }
}
);
于 2013-10-18T05:10:12.347 に答える