JavaRush /Java Blog /Random-JA /CompareTo メソッド

CompareTo メソッド

Random-JA グループに公開済み
配列またはコレクションに格納されている同じ型のオブジェクトを整理するために、Java 開発者は を考案しましたComparable。宣言するメソッドは 1 つだけですcompareTo
public interface Comparable<T> {
    public int compareTo(T o);
}
比較メソッド - 1インターフェースは、Comparableメソッドのパラメータとして受け入れるオブジェクトのタイプによってパラメータ化されますcompareTo。この場合、比較するオブジェクトのタイプをコンパイラーに警告します。型同一性条件が満たされていない場合は、エラーが発生しますClassCastException。Java のメソッドは、compareTo呼び出し元のオブジェクトとパラメータとして渡されたオブジェクトを比較し、比較の結果として整数を返します。
  • 呼び出し元のオブジェクトがパラメータとして渡されたオブジェクトより大きい場合は正。
  • 呼び出し元のオブジェクトがパラメータとして渡されたオブジェクトより小さい場合は負。
  • オブジェクトが等しい場合は null。
オブジェクト比較ロジックの作成はクラス開発者の唯一の関心事であり、順序付けの望ましい結果によって決定されます。

Java で CompareTo メソッドが必要なのはなぜですか?

Java プログラマは、オブジェクトの配列やリストを扱わなければならないことがよくあります。大量のデータを扱う場合、多くの場合、データを整理または並べ替えた形式で保存すると便利です。第一に、必要な情報を検索する際のコレクションの操作が高速化され、第二に、整理されたデータが視覚的にわかりやすくなります。
CompareTo メソッド - 2
オブジェクトの配列を並べ替える最も簡単かつ効果的な方法の 1 つはsort()クラスメソッドでありArrays、リスト形式のオブジェクトのコレクションも同様のクラス メソッドですCollections。これらのメソッドを使用して並べ替えるために、Java 開発者は、並べ替え基準を指定する方法を自由に選択できるようにしました。Comparable並べ替えるオブジェクトのクラスにインターフェイスを実装するか、Comparator. 最初のケースでは、並べ替えメソッドは配列またはリストの形式でオブジェクトのセットを受け入れます。
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
そして 2 番目では、インターフェースの別の実装が加えられていますComparator
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
このインターフェイスは、Comparableソート時にオブジェクトの自然な (私たちの観点から最も論理的な) 順序を設定したい場合に使用されます。これは、設計段階でこのクラスのオブジェクトを比較するためのアルゴリズムを「ハードワイヤード」する方法でもあります。たとえば、このインターフェイスの実装を使用すると、主要なプリミティブ型のラッパー クラスにおける自然な順序付けの基準が定義されます: 、ByteCharacterLongIntegerShortDoubleFloatBoolean。これは、これらのクラスには、必要に応じてプログラムで使用できるStringメソッドが実装されていることも意味します。このメソッドがクラスでどのように実装されるかを確認するために、文字列比較のcompareTo例を見てみましょう。 String
String str1="Аарон";
        String str2="АAPOH";
        String str3="аарон";
        String str4="ААрон";
        String str5="аАрон";
        String str6="Берта";
        String str7="берта";
String[] allStr=new String[]{str1,str2,str3,str4, str5,str6, str7};
        Arrays.sort(allStr);
        for (String s:allStr){
            System.out.println(s);
        }
    }
このコードをメソッドで実行するとmain、次の結果が得られます。
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
クラスの例でわかるようにString、このメソッドはcompareTo文字列をアルファベット順、辞書順、および大文字と小文字を区別して配置します。この文字列比較の順序は、クラスの開発者によってString自然なものとして定義されています。辞書編集順とは何かをより簡単に理解するには、言語辞書で単語がどのように配置されているかを覚えておくだけで十分です。数値を比較する場合オブジェクトは昇順に並べられます。この比較ロジックは、クラス 、 、 、 、 、 にByte埋め込まCharacterれています。 LongIntegerShorDoubleFloat

クラスに比較を実装しましょう

クラス内でオブジェクトを比較する機能を構築する方法の例を見てみましょう。Java メソッドを実装する場合compareto、オブジェクトの順序付けの 1 つ以上の基準を指定したり、およびクラスcomparetoのメソッドを使用したりすることもできます。たとえば、クラス オブジェクトの場合は名前による並べ替えを設定し、名前が等しい場合は年齢による並べ替えを設定します。オブジェクトは自然な順序で (値が増加するにつれて) 配置されます。クラス: StringIntegerUserUser
public class User  implements Comparable <User>{//добавляем возможность сравнивать an objectы User

    private String name;
    private Integer age;
    private String email;

    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    @Override
//реализуем метод compareTo интерфейса Comparable
    public int compareTo(User o) {

//используем метод compareTo из класса String для сравнения имен
        int result = this.name.compareTo(o.name);

//если имена одинаковые -  сравниваем возраст,
используя метод compareTo из класса Integer

        if (result == 0) {
            result = this.age.compareTo(o.age);
        }
        return result;
    }

    @Override
    public String toString() {
        return "{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
クラスメソッドを使用して、compareToクラスに実装された メソッドの動作をテストしてみましょう。 UsersortCollections
public static void main(String[] args) {
    User user = new User("Andrey", 19, "andryha@mail.ru");
    User user2 = new User("Олег", 25, "oleg@mail.ru");
    User user3 = new User("Andrey", 24,"opr@google.com");
    User user4 = new User("Igor", 16, "igor@mail.ru");
    User user5 = new User("Andrey", 44,"stary@google.com");
    List<User> list = new ArrayList<>();

    list.add(user);
    list.add(user2);
    list.add(user3);
    list.add(user4);
    list.add(user5);

    System.out.println("-------до сортировки--------");
    for (User u : list) {
        System.out.println(u);
    }
    System.out.println("-------после сортировки-----");
    Collections.sort(list);
    for (User u : list) {
        System.out.println(u);
    }
}
 }
}
メソッドの結果main:
-------до сортировки--------
{name='Андрей',  age=19,  email='andryha@mail.ru'}
{name='Олег',    age=25,  email='oleg@mail.ru'}
{name='Андрей',  age=24,  email='opr@google.com'}
{name='Игорь',   age=16,  email='igor@mail.ru'}
{name='Андрей',  age=44,  email='stary@google.com'}
-------после сортировки-----
{name='Андрей',  age=19,  email='andryha@mail.ru'}
{name='Андрей',  age=24,  email='opr@google.com'}
{name='Андрей',  age=44,  email='stary@google.com'}
{name='Игорь',   age=16,  email='igor@mail.ru'}
{name='Олег',    age=25,  email='oleg@mail.ru'}
それでは、まとめてみましょう。すべてにおいて順序を支持し、不要なコードを使用せずにオブジェクトを配列またはリストに配置したい場合は、 インターフェース を使用してくださいComparable。そのcompareToメソッドを実装すると、クラス内のオブジェクトを自然に順序付けするためのメカニズムを非常に簡単に構築できます。Java ライブラリで記述されている標準クラスのオブジェクトのコレクションと配列を操作する必要がある場合は、これらのクラスで既製の実装を使用してくださいcompareTo
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION