Javaのいくつかのよくある比較器の実現方法について話します。
Javaではしばしば対象配列の順序付け問題に触れますが、オブジェクト間の比較問題に関連します。
通常のオブジェクト間の比較は、2つの観点から見られます。
第一の方面:対象の住所は同じかどうか、つまり同じ対象から引用するかどうかです。この方法は直接「=」を使って完成できます。
第二の方面:対象のある属性の角度で比較します。
最新のJDK 8からは、オブジェクトの比較を実現する3つの方法があります。
一、Object類のequalsを上書きする方法。
二、Comprableインターフェースを継承し、compreTo()方法を実現する。
三、個別の対象コンパレータを定義し、Compratorインターフェースから継承し、compre()方法を実現する。
使う順序の違いによって、具体的にどのような方法を選ぶかによって、対象の比較が違ってきます。
equals()を上書きする方法は、オブジェクト配列の順序付けを自分で実現するために使用されますが、java内蔵の順序付けアルゴリズムを使用する場合は、後の2つの方法を使用しても良いです。
まず第二の方法を見てください。この方法は自分で作成したクラスにComprableインターフェースを引き継ぎ、compreToを実現する方法です。この場合、java.util.Arays.sort()を使います。
方法の場合は、具体的なコンパレータを指定しなくても、ソート()方法は対象の自分の比較関数を使って対象の並べ替えを行います。
以下は具体的な例です。
開発されたコードをもとに、対象の比較機能を充実させるためには、前のコードを変更したくないです。この場合、JDK 1.8からCompratorインターフェースが現れました。このような状況を補うためです。
この場合は、対象のコンパレータを単独で定義し、Compratorインターフェースを継承し、compre()方法を実現する必要があります。サンプルコードは以下の通りです。
この簡単な話はJavaの中のいくつかのよくあるコンパレータの実現方法です。小編集は皆さんに全部の内容を共有しています。参考にしてもらいたいです。皆さんもよろしくお願いします。
通常のオブジェクト間の比較は、2つの観点から見られます。
第一の方面:対象の住所は同じかどうか、つまり同じ対象から引用するかどうかです。この方法は直接「=」を使って完成できます。
第二の方面:対象のある属性の角度で比較します。
最新のJDK 8からは、オブジェクトの比較を実現する3つの方法があります。
一、Object類のequalsを上書きする方法。
二、Comprableインターフェースを継承し、compreTo()方法を実現する。
三、個別の対象コンパレータを定義し、Compratorインターフェースから継承し、compre()方法を実現する。
使う順序の違いによって、具体的にどのような方法を選ぶかによって、対象の比較が違ってきます。
equals()を上書きする方法は、オブジェクト配列の順序付けを自分で実現するために使用されますが、java内蔵の順序付けアルゴリズムを使用する場合は、後の2つの方法を使用しても良いです。
まず第二の方法を見てください。この方法は自分で作成したクラスにComprableインターフェースを引き継ぎ、compreToを実現する方法です。この場合、java.util.Arays.sort()を使います。
方法の場合は、具体的なコンパレータを指定しなくても、ソート()方法は対象の自分の比較関数を使って対象の並べ替えを行います。
以下は具体的な例です。
import java.util.Arrays;
class BookCook implements Comparable<BookCook>{
private String title;
private double price;
public BookCook(String title,double price){
this.title = title;
this.price = price;
}
@Override
public String toString() {
return " :"+this.title+", :"+this.price;
}
@Override
public int compareTo(BookCook o) {
if(this.price > o.price){
return 1;
}else if(this.price < o.price){
return -1;
}else{
return 0;
}
}
}
以上の二つの方法を使うと、実際の開発問題に満足できます。しかし、次のような場合は、Compratorインターフェースを使用する必要があります。開発されたコードをもとに、対象の比較機能を充実させるためには、前のコードを変更したくないです。この場合、JDK 1.8からCompratorインターフェースが現れました。このような状況を補うためです。
この場合は、対象のコンパレータを単独で定義し、Compratorインターフェースを継承し、compre()方法を実現する必要があります。サンプルコードは以下の通りです。
class Student {
private String name;
private double score;
public Student(String name,double score){
this.name = name;
this.score = score;
}
public double getScore(){
return this.score;
}
@Override
public String toString() {
return " :"+this.name+", :"+this.score;
}
}
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1,Student o2) {
if(o1.getScore() > o2.getScore()){
return 1;
}else if(o1.getScore() < o2.getScore()){
return -1;
}else{
return 0;
}
}
}
public class TestComparator {
public static void main(String[] args) {
Student[] sts = new Student[]{
new Student(" ",60),
new Student(" ",90),
new Student(" ",80),
new Student(" ",95)
};
java.util.Arrays.sort(sts, new StudentComparator());
System.out.println(java.util.Arrays.toString(sts));
}
}
以上の3つの場合、具体的な状況によって、異なる方法を選んで実際の問題を解決します。この簡単な話はJavaの中のいくつかのよくあるコンパレータの実現方法です。小編集は皆さんに全部の内容を共有しています。参考にしてもらいたいです。皆さんもよろしくお願いします。