Java比較器を詳しく説明する
本文
Javaのオブジェクトは通常の状況では比較しかできません。==または!使用できません。しかし、実際の開発では、複数のオブジェクトを並べ替える必要があります。比較対象のサイズが必要です。
Javaがオブジェクトの並べ替えを実現する方法は2つあります。自然ランキング:java.lang.comprable カスタムソート:java.util.comprator 1.Comprable自然並び替えは、String、包装などのComprableインターフェースを実現し、compreTo(obj)方法を書き換えて、2つのオブジェクトの大きさを比較する方法を提供している。 はString、包装類のようにcompreTo()を書き換える方法の後、小さい時から大きな順に並べられた です。 compreTo(obj)のルールを書き換える: 現在のオブジェクトのthisが、参照対象のOB jより大きい場合、正の整数を返します。
現在のオブジェクトthisが、参照対象のOB jより小さい場合、負の整数を返します。
現在のオブジェクトthisが参照対象のOB jに等しい場合、ゼロを返します。はカスタムクラスに対して、順序付けが必要ならば、カスタマイズクラスにComprableインターフェースを実現させて、compreTo(obj)方法を書き換えることができます。compreTo(obj)方法ではどのように並べ替えられているかを指定します。デフォルトも小さい時から までです。
要素のタイプがjava.lang.cmparableインターフェースを実現していない場合、コードの修正が不便であるか、java.lang.cmparableインターフェースを実現した順序付け規則が現在の操作に適合していない場合、Compratorのオブジェクトを使用して並べ替えられます。 comppare(Object o 1,Object o 2)方法を書き換えて、o 1とo 2の大きさを比較します。もし方法が正の整数に戻るなら、o 1はo 2より大きいと表します。0を返したら、等しいことを表します。負の整数を返します。o 1がo 2以下であることを示します。 は、Collection.sortまたはArays.sortのようなCoparatorをsort方法に渡すことができ、順序付けの正確な制御を可能にする。 はまた、Compratorを使用して、順序setまたは規則的マッピングのようないくつかのデータ構造の順序を制御したり、自然順序のないオブジェクトのcollectionの順序を提供したりすることができる。
String、包装類はすでにcompre()の直接呼び出しを実現しました。 Comprableインターフェースの方式が一定であれば、Comprableインターフェース実装類のオブジェクトはどの位置でも比較できるようにする。 Compratorインターフェースは、一時的な比較に属する。 以上はJava比較器の詳細を理解しました。Java比較器に関する資料は他の関連記事に注目してください。
Javaのオブジェクトは通常の状況では比較しかできません。==または!使用できません。しかし、実際の開発では、複数のオブジェクトを並べ替える必要があります。比較対象のサイズが必要です。
Javaがオブジェクトの並べ替えを実現する方法は2つあります。
現在のオブジェクトthisが、参照対象のOB jより小さい場合、負の整数を返します。
現在のオブジェクトthisが参照対象のOB jに等しい場合、ゼロを返します。
public void test1(){
String[] arr = new String[]{"AA","BB","DD","WW","MM","PP","CC"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));//[AA, BB, CC, DD, MM, PP, WW]
}
カスタムクラスは書き換えが必要です。
package com.atguigu.java1;
/**
* @author MD
* @create 2020-07-13 15:52
*/
public class Goods implements Comparable{
private String name;
private double price;
public Goods() {
}
public Goods(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Goods{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
// : ,
@Override
public int compareTo(Object o) {
if(o instanceof Goods){
Goods goods = (Goods)o;
//
if (this.price > goods.price){
return 1;
}else if(this.price < goods.price){
return -1;
}else{
//return 0;
return this.name.compareTo(goods.name);
}
// :
//return Double.compare(this.price , goods.price);
}
throw new RuntimeException(" ");
}
}
//
public void test2(){
Goods[] arr = new Goods[4];
arr[0] = new Goods("lx",123.12);
arr[1] = new Goods("xm",23.12);
arr[2] = new Goods("hw",67);
arr[3] = new Goods("de",99);
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
//[Goods{name='xm', price=23.12}, Goods{name='hw', price=67.0}, Goods{name='de', price=99.0}, Goods{name='lx', price=123.12}]
}
2.Compratorカスタムソート要素のタイプがjava.lang.cmparableインターフェースを実現していない場合、コードの修正が不便であるか、java.lang.cmparableインターフェースを実現した順序付け規則が現在の操作に適合していない場合、Compratorのオブジェクトを使用して並べ替えられます。
// ,String compareTo(obj)
public void test3(){
String[] arr = new String[]{"AA","BB","DD","WW","MM","PP","CC"};
//
Arrays.sort(arr, new Comparator() {
//
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof String && o2 instanceof String){
String s1 = (String)o1;
String s2 = (String)o2;
return -s1.compareTo(s2);
}
throw new RuntimeException(" ");
}
});
System.out.println(Arrays.toString(arr));//[WW, PP, MM, DD, CC, BB, AA]
}
デフォルトは小さい時から大きい時まで、直接に前に記号をつけることができます。高い時から低い時までです。String、包装類はすでにcompre()の直接呼び出しを実現しました。
public void test4(){
Goods[] arr = new Goods[4];
arr[0] = new Goods("lx",123.1);
arr[1] = new Goods("lx",23.12);
arr[2] = new Goods("hw",67);
arr[3] = new Goods("de",99);
// , , ,
Arrays.sort(arr, new Comparator<Goods>() {
@Override
public int compare(Goods o1, Goods o2) {
if (o1.getName().equals(o2.getName())){
return -Double.compare(o1.getPrice(),o2.getPrice());
}else{
return o1.getName().compareTo(o2.getName());
}
}
});
System.out.println(Arrays.toString(arr));
//[Goods{name='de', price=99.0}, Goods{name='hw', price=67.0}, Goods{name='lx', price=123.1}, Goods{name='lx', price=23.12}]
}
ComprableインターフェースとCompratorの使用の対比: