この質問にはすでに答えがあります。
オブジェクトのプロパティの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メソッドはうまくいき、実際に上記のコードを試してみたところエラーが発生したため、実装部分を削除しましたが、うまくいきました。
同程度の :
コンパレータ:
コンパレータは複数のソート順を提供します。言い換えれば、私たちは 次のような複数の要素に基づいてコレクションを並べ替えることができます。 ID、名前、価格など
比較子は元のクラスには影響しません。つまり、実際のクラスは 変更されていません。
比較器は要素をソートするためにcompare()メソッドを提供します。
Comparator型のリスト要素は以下のようにソートできます。 Collections.sort(List、Comparator)メソッド。
ここでやりたいことができる方法は2つあります。1つはカスタムを使用することです。Comperator
(あなたが上でやったように)そして第二は実装することですComperable
インタフェース。
両方をする必要はありません。
最初の方法(コンパレータ) - 比較メソッドを使ってsortメソッドを実行すると、sortメソッドはオブジェクトを比較するためにそれを使います。コンパレータを使用しているので、実装する必要はありません。compareTo
そしてComparable
第二の方法(comperable) - 演算子なしでsortメソッドを実行します。ここで起こることは、sortメソッドがあなたのオブジェクトを次のものを使って比較するということです。compareTo
からの方法Comperable
オブジェクトに実装したインターフェース
どちらの方法でも動作しますが、両方必要ではありません
二つありますCollections.sort()
メソッド
最初にのみ受け取るCollection
ソートして使用するcompareTo
方法。この場合あなたのクラスは実装する必要がありますComparable
。
もう一人あなたが使ったことがある2つの引数を受け取ります。最初はCollection
二つ目はComparator
。これはあなたのクラスが実装していても構いません。Comparable<? super YourClass>
提供されている用途Comparator
。
ラムダは、機能的なインターフェースを実装するときに役に立ちます。
Collections.sort(phoneBooks, (o1, o2)-> o1.getName().compareToIgnoreCase(o2.getName()));