web-dev-qa-db-ja.com

Comparator <?>パラメーターを使用したTreeSetコンストラクター

JavaのクラスTreeSetのドキュメントでは、コンストラクターの1つが次のヘッダーを持つことが示されています。

TreeSet(Comparator<? super E> c)

コンパレータオブジェクトを引数として取るTreeSetのコンストラクタがある理由を誰かが説明できますか?なぜこれが行われるのかはわかりません。

16
TheRapture87

TreeSetの要素はソートされたままです。

Comparatorを持たないコンストラクターを使用する場合、要素クラスの自然な順序(Comparableの実装で定義)を使用して、TreeSetの要素をソートします。

別の順序が必要な場合は、コンストラクタでコンパレータを指定します。

15
Eran

上記の答えはすべて正しいですが、カスタムコンパレータは、異なる並べ替えの結果とは別に、値を異なる方法でフィルタリングすることを追加したいと思います。

セットの値は一義的であるため、カスタムコンパレータが2つの値が同一であると返した場合、そのうちの1つのみがセットに表示されます。

    Set<String> s = new TreeSet<>(new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return s1.trim().compareTo(s2.trim());
        }
    });

    s.add("1");
    s.add(" 1");
    s.add("2 ");
    s.add("2");
    s.add(" 2 ");   

    Arrays.toString(s.toArray()); // [ "1", "2 "]
9
Giovanni P.

このコンストラクターを使用すると、ComparatorTの背後にあるツリーに挿入するときに使用されるSetを定義できます。

Comparator<String> comp = (String o1, String o2) -> (o1.compareTo(o2));
Set<String> ts = new TreeSet<>(comp);
7
user1907906

ユーザー定義のルールに従ってSetの要素をソートするために使用されます。

javadoc を参照してください:

public TreeSet(コンパレータコンパレータ)

指定されたコンパレーターに従ってソートされた、新しい空のツリーセットを構築します

セットに挿入されるすべての要素は、指定されたコンパレーターによって相互に比較可能である必要があります。comparator.compare(e1、e2)は、セット内の要素e1およびe2に対してClassCastExceptionをスローしてはなりません。

ユーザーがこの制約に違反する要素をセットに追加しようとすると、add呼び出しはClassCastExceptionをスローします。

パラメータ:

comparator-このセットの順序付けに使用されるコンパレータ。 nullの場合、要素の自然な順序が使用されます。

自然オブジェクトの順序付けの詳細については、 here を参照してください。

1

Treesetクラスには以下のコンストラクターがあるため、Treesetは、Comparator c.Belowで説明されている順序で要素を格納します。これは、同じことを示す例です。

    **Constructor :-**
    TreeSet(Comparator<? super E> c)
class Employeee {
            public Employeee(int id, String name) {
                super();
                this.id = id;
                this.name = name;
            }

            public int getId() {
                return id;
            }

            public void setId(int id) {
                this.id = id;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            private int id;
            private String name;
        }

        class namecomp implements Comparator<Employeee> {
            public int compare(Employeee paramT1, Employeee paramT2) {
                if (paramT1.getName().compareTo(paramT2.getName()) > 0)
                    return -1;
                else if (paramT1.getName().compareTo(paramT2.getName()) < 0)
                    return 1;
                else
                    return 0;
            }
        }

        public class TreeSetImpl {
            public static void main(String[] args) {
                SortedSet<Employeee> treeSet = new TreeSet<Employeee>(new namecomp());
                Employeee e1 = new Employeee(1, "Iftekhar");
                Employeee e2 = new Employeee(2, "Khan");
                Employeee e3 = new Employeee(3, "Apple");
                treeSet.add(e1);
                treeSet.add(e2);
                treeSet.add(e3);
                Iterator<Employeee> it = treeSet.iterator();
                while (it.hasNext()) {
                    System.out.println(it.next().getId());
                }
            }
        }

ここで、namecompがComparatorインターフェースを実装しているため、Nameフィールドに基づいてEmployeeeクラスの要素を降順でソートしています。現在、TreesetはNameCompコンパレータを実装して、Nameフィールドに基づいて要素を降順で格納します。 出力 2 1 3

これが質問に答えることを願っています。

1
iftekhar khan

TreeSetバイナリ検索ツリー です。これは、2つの要素aが与えられたという概念に基づいています。 baが「より小さい」場合b、またはそうではありません。ただし、独自のクラスを定義する場合、TreeSetは、そのクラスの特定のオブジェクトが別のオブジェクトよりも「小さい」かどうかを判断する方法を知りません。内容。したがって、Comparatorの代わりに比較を実行できるTreeSetを作成できます。

1
The following code shows how to use TreeSet.TreeSet(Comparator <? super E > comparator) constructor.
/**
 *Output: 
 F E D C B A 
  */

import Java.util.Comparator;
import Java.util.TreeSet;

class MyComparator implements Comparator<String> {
  public int compare(String a, String b) {
    String aStr, bStr;

    aStr = a;
    bStr = b;

    return bStr.compareTo(aStr);
  }
  // No need to override equals.
}

public class MainClass {
  public static void main(String args[]) {
    TreeSet<String> ts = new TreeSet<String>(new MyComparator());

    ts.add("C");
    ts.add("A");
    ts.add("B");
    ts.add("E");
    ts.add("F");
    ts.add("D");

    for (String element : ts)
      System.out.print(element + " ");

    System.out.println();
  }
}
1

_Comparator interface is used to order the objects of user-defined class._

複数の並べ替えシーケンスを提供します。つまり、任意のデータメンバーに基づいて要素を並べ替えることができます。たとえば、rollno、name、age、その他何でも可能です。

ComparatorをTreeSet(Comparator<? super E> c)に渡すことにより、希望するパラメーターに基づいてTreeSetを注文できることを意味します。

TreeSetでComparatorを渡すことにより、TreeSetで使用される自然な順序付けを使用せずに、必要に応じてTreeSetを順序付けることができます。

_TreeSet<User>_があり、フィールドidを持つUserクラスがあるとします。

これで、ユーザーIDに基づいてTreeSetを並べ替える場合、TreeSetでComparatorオブジェクトを渡して、目的の順序を取得できます。

0
Abhishek

デフォルトのコンストラクタを持つTreeSetは、要素を自然な昇順で並べ替えますが、要件に応じてカスタムの並べ替えが必要な場合は、Comparatorインターフェイスを使用する必要があります。 eqこれはデフォルトのクラスEmployeeであり、このクラスを給与に従ってソートする必要があります。

public class Employee {

private int Id;

private String name;

private int salary;

public Employee(int id, String name, int salary) {

    super();
    Id = id;
    this.name = name;
    this.salary = salary;
}
public int getId() {

    return Id;
}
public void setId(int id) {

    Id = id;
}
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 "ID : "+Id +" Name : "+name+" Salary : "+salary+"\n";
}
}

ここでは、Comparatorを実装して別のクラスを作成しました。

public class EmpSalaryComparator implements Comparator{

public int compare(Object o1, Object o2) {

    Employee e1=(Employee) o1;
    Employee e2=(Employee) o2;
    return e1.getSalary()-e2.getSalary();
}
}

public class Test1 {

public static void main(String[] args) {

    TreeSet t1=new TreeSet(new EmpSalaryComparator());
    Employee e1=new Employee(1001, "Ram", 1000);
    Employee e2=new Employee(1002, "lucky", 7000);
    Employee e3=new Employee(1003, "sumo", 3000);
    Employee e4=new Employee(1004, "kharvi", 3000);
    Employee e5=new Employee(1005, "priya", 1000);

    t1.add(e1);
    t1.add(e2);
    t1.add(e3);
    t1.add(e4);
    t1.add(e5);
    System.out.println(t1);
}
}
0
Vivek Kumar