1

この質問にはすでに答えがあります。

オブジェクトのプロパティの1つに基づいてオブジェクトの配列リストをソートしたいのですが、ここで私のコード 'name'で言うと、このオプションに 'Comparator'を使用して検索したところ、以下のクラスが私のオブジェクトです。

public class PhoneBook{

long number;
String name;
String family;
String address;

public long getNumber() {
    return number;
}

public void setNumber(long number) {
    this.number = number;
}

public String getName() {
    return name;
}

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

public String getFamily() {
    return family;
}

public void setFamily(String family) {
    this.family = family;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

}

そして私はこのように私のsortメソッドで 'compare'メソッドをオーバーライドします:

public void sort()
{
    Collections.sort(phoneBooks, new Comparator<PhoneBook>() {
        @Override
        public int compare(PhoneBook o1, PhoneBook o2) {
            return o1.getName().compareToIgnoreCase(o2.getName());
        }
    });
}

しかし、私の問題は、このような最初のコードで 'Comparable'を実装しないと混乱することです。

public class PhoneBook implements Comparable<PhoneBook>

sortメソッドはうまくいき、実際に上記のコードを試してみたところエラーが発生したため、実装部分を削除しましたが、うまくいきました。


3 답변


2

同程度の :

  1. 比較可能な単一の並べ替え順序を提供します。言い換えれば、私たちは id、name、priceなどの単一の要素に基づいてコレクションをソートできます。
  2. 元のクラスに匹敵する、実際のクラスは変更されています。
  3. Comparableは、要素をソートするためのcompareTo()メソッドを提供します。
  4. Comparable型のリスト要素は以下のようにソートできます。 Collections.sort(List)メソッド

コンパレータ:

  1. コンパレータは複数のソート順を提供します。言い換えれば、私たちは 次のような複数の要素に基づいてコレクションを並べ替えることができます。 ID、名前、価格など

  2. 比較子は元のクラスには影響しません。つまり、実際のクラスは 変更されていません。

  3. 比較器は要素をソートするためにcompare()メソッドを提供します。

  4. Comparator型のリスト要素は以下のようにソートできます。 Collections.sort(List、Comparator)メソッド。


2

ここでやりたいことができる方法は2つあります。1つはカスタムを使用することです。Comperator(あなたが上でやったように)そして第二は実装することですComperableインタフェース。 両方をする必要はありません。

最初の方法(コンパレータ) - 比較メソッドを使ってsortメソッドを実行すると、sortメソッドはオブジェクトを比較するためにそれを使います。コンパレータを使用しているので、実装する必要はありません。compareToそしてComparable

第二の方法(comperable) - 演算子なしでsortメソッドを実行します。ここで起こることは、sortメソッドがあなたのオブジェクトを次のものを使って比較するということです。compareToからの方法Comperableオブジェクトに実装したインターフェース

どちらの方法でも動作しますが、両方必要ではありません


2

二つありますCollections.sort()メソッド

最初にのみ受け取るCollectionソートして使用するcompareTo方法。この場合あなたのクラスは実装する必要がありますComparable

もう一人あなたが使ったことがある2つの引数を受け取ります。最初はCollection二つ目はComparator。これはあなたのクラスが実装していても構いません。Comparable<? super YourClass>提供されている用途Comparator

ラムダは、機能的なインターフェースを実装するときに役に立ちます。

Collections.sort(phoneBooks, (o1,  o2)-> o1.getName().compareToIgnoreCase(o2.getName()));


  • おかげで、私はあなたが上記で述べたLambdaを使用しようとしています、しかし私はLambdaがここでどのように動作するかわかりません、私はあなたがLambdaのために書いた行を試みましたこれはうまくいきません。 - Bita Karimi
  • @BitaMirshafiee閉じ括弧を追加しました。 - Yoda

リンクされた質問


関連する質問

最近の質問