配列またはコレクションに格納されている同じ型のオブジェクトを整理するために、Java 開発者は を考案しました
オブジェクトの配列を並べ替える最も簡単かつ効果的な方法の 1 つは
Comparable
。宣言するメソッドは 1 つだけですcompareTo
。
public interface Comparable<T> {
public int compareTo(T o);
}
インターフェースは、Comparable
メソッドのパラメータとして受け入れるオブジェクトのタイプによってパラメータ化されますcompareTo
。この場合、比較するオブジェクトのタイプをコンパイラーに警告します。型同一性条件が満たされていない場合は、エラーが発生しますClassCastException
。Java のメソッドは、compareTo
呼び出し元のオブジェクトとパラメータとして渡されたオブジェクトを比較し、比較の結果として整数を返します。
- 呼び出し元のオブジェクトがパラメータとして渡されたオブジェクトより大きい場合は正。
- 呼び出し元のオブジェクトがパラメータとして渡されたオブジェクトより小さい場合は負。
- オブジェクトが等しい場合は null。
Java で CompareTo メソッドが必要なのはなぜですか?
Java プログラマは、オブジェクトの配列やリストを扱わなければならないことがよくあります。大量のデータを扱う場合、多くの場合、データを整理または並べ替えた形式で保存すると便利です。第一に、必要な情報を検索する際のコレクションの操作が高速化され、第二に、整理されたデータが視覚的にわかりやすくなります。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
ソート時にオブジェクトの自然な (私たちの観点から最も論理的な) 順序を設定したい場合に使用されます。これは、設計段階でこのクラスのオブジェクトを比較するためのアルゴリズムを「ハードワイヤード」する方法でもあります。たとえば、このインターフェイスの実装を使用すると、主要なプリミティブ型のラッパー クラスにおける自然な順序付けの基準が定義されます: 、Byte
、Character
、Long
、Integer
、Short
、Double
、Float
、Boolean
。これは、これらのクラスには、必要に応じてプログラムで使用できる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
れています。 Long
Integer
Shor
Double
Float
クラスに比較を実装しましょう
クラス内でオブジェクトを比較する機能を構築する方法の例を見てみましょう。Java メソッドを実装する場合compareto
、オブジェクトの順序付けの 1 つ以上の基準を指定したり、およびクラスcompareto
のメソッドを使用したりすることもできます。たとえば、クラス オブジェクトの場合は名前による並べ替えを設定し、名前が等しい場合は年齢による並べ替えを設定します。オブジェクトは自然な順序で (値が増加するにつれて) 配置されます。クラス: String
Integer
User
User
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
クラスに実装された メソッドの動作をテストしてみましょう。 User
sort
Collections
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
。
GO TO FULL VERSION