オブジェクトの ArrayList を Comparable と Comparator で並べ替える
このチュートリアルでは、java.lang.Comparableとjava.util.Comparatorの2つのインタフェースを使用して、オブジェクトを含むArrayListをソートする方法を説明します。プログラムで String または Integer の ArrayList を並べ替える必要がある場合は、次の 2 つの記事を確認することをお勧めします- 文字列または整数の ArrayList を並べ替える
- ArrayList を降順で並べ替える
Comparableインタフェースは、事前定義されたメソッドobject1.compareTo(object2).
Comparable
まず、Comparableインターフェイスを実装していないオブジェクトのarraylistのソート結果を見てみましょう。
Employe.javaクラスを作成しましょう。
public class Employee {
private 文字列名;
private int age;
民間の長期給与。
public String getName() {
return name;
}
public int getAge() {
return age;
}
public long getSalary() {
return salary;
}
public Employee(文字列名, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
@Override
//このメソッドは従業員情報を表示します
public String toString() {
return "[name=" + this.name + ", age=" + this.age + ", salary=" +
this.salary + "]";
}
}
ArrayListのリストを作成します:
これで、これら 2 つのインターフェイスの重要性を理解したはずです。
プロパティ (employee's salary) でリストを並べ替えるとします。これはComparableインターフェースを実装することで実現でき、JavaはcompareTo()declared Override.
import java.util.ArrayList;Collections.sort()は、ComparableインタフェースとComparatorインタフェースの両方を使用しない限り機能しないオブジェクトのArrayListに対して実行されるため、問題が発生します。コンパイルエラーが表示されます:
import java.util.Collections;
public class ArrayListComparable {
public static void main(String[] args) {
ArrayList<従業員>arraylist = new ArrayList<従業員>();
arraylist.add(new Employe("mateo", 32, 20000));
arraylist.add(new Employe("katia", 26, 10000));
arraylist.add(new Employe("aline", 30, 40000));
arraylist.add(new Employe("salim", 28, 35000));
System.out.println("従業員の順序付きリスト:\n"+Collections.sort(arraylist));
}
}
スレッド "main"java.lang.Errorの例外:未解決のコンパイルの問題:
演算子+は引数の型String、void
に対して未定義ですバインドの不一致:Collections型のジェネリックメソッドsort(List)は、引数(ArrayList )には適用されません。推論された型 Employe は、境界パラメーター >
at ArrayListComparable.main(ArrayListComparable.java:14)
これで、これら 2 つのインターフェイスの重要性を理解したはずです。
プロパティ (employee's salary) でリストを並べ替えるとします。これはComparableインターフェースを実装することで実現でき、JavaはcompareTo()declared Override.
Employe.javaクラスにComparableインタフェースを実装すると、結果は次のようになります。
public class Employe implements Comparable<従業員>{メソッドを呼び出す権利が与えられました Collections.sort():
private 文字列名。
private int age;
民間の長期給与。
public String getName() {
return name;
}
public int getAge() {
return age;
}
public long getSalary() {
return salary;
}
public Employee(文字列名, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
@Override
//このメソッドは従業員情報を表示します
public String toString() {
return "[name=" + this.name + ", age=" + this.age + ", salary=" +
this.salary + "]";
}
@Override
public int compareTo(Employee emp) {
//従業員を年齢順に並べ替える croiddant
//その従業員の年齢
//がオブジェクトとの比較><オブジェクトより小さい、等しい、または大きい場合、負、ゼロ、または正の整数を遡及 return (this.age - emp.age);
}
}
import java.util.ArrayList;このコードを実行すると、次の結果が得られます:
import java.util.Collections;
public class ArrayListComparable {
public static void main(String[] args) {
ArrayList<従業員>arraylist = new ArrayList<従業員>();
arraylist.add(new Employe("mateo", 32, 20000));
arraylist.add(new Employe("katia", 26, 10000));
arraylist.add(new Employe("aline", 30, 40000));
arraylist.add(new Employe("salim", 28, 35000));
Collections.sort(arraylist);
System.out.println("年齢順の従業員リスト:\n");
for(Employee e:arraylist)
System.out.println(e);
}
}
年齢順の従業員リスト:
[name=katia, age=26, salary=10000]
[name=salim, age=28, salary=35000]
[name=aline, age=30, salary=40000]
[name=mateo, age=32, salary=20000]
Comparator
ArrayListをソートすると、上記の従業員のリストは昇順でソートされています。しかし、なぜComparatorインターフェイスを使用するのですか?並べ替えがComparableとは異なり、いくつかのパラメーターに基づいている場合があるためです。たとえば、名前、年齢、給与に基づいて従業員を並べ替えます.compare(Object o1, Object o2) は 2 つのオブジェクトを取ります。この例では、最初の引数が 2 番目の引数より小さい場合は負の整数を返し、等しい場合は 0 を返し、最初の引数が 2 番目の引数より大きい場合は正の整数を返すように、3 回 (name、age、salary) を実装する必要があります。
import java.util.Comparator;テストクラスmain:
public class Employee {
private 文字列名。
private int age;
民間の長期給与。
public String getNom() {
return name;
}
public int getAge() {
return age;
}
public long getSalary() {
return salary;
}
public Employee(文字列名, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
@Override
//このメソッドは従業員情報を表示します
public String toString() {
return "[name=" + this.name + ", age=" + this.age + ", salary=" +
this.salary + "]";
}
/*
* 従業員を名前でソートするためのコンパレータ
*/
public static Comparator<従業員>ComparatorName = new Comparator<従業員>() {
@Override
public int compare(Employee e1, Employee e2) {
return e1.getName().compareTo(e2.getName());
}
};
/*
* 従業員を年齢別にソートするためのコンパレータ
*/
public static Comparator<従業員>ComparatorAge = new Comparator<従業員>() {
@Override
public int compare(従業員 e1, 従業員 e2) {
return (int) (e1.getAge() - e2.getAge());
}
};
/*
* 従業員を給与でソートするためのコンパレータ
*/
public static Comparator<従業員>ComparatorSalary = new Comparator<従業員>() {
@Override
public int compare(Employee e1, Employee e2) {
return (int) (e1.getSalary() - e2.getSalary());
}
};
}
import java.util.ArrayList;このコードを実行すると、次のようになります。
import java.util.Collections;
public class main{
public static void main(String[] args) {
ArrayList<従業員>arraylist = new ArrayList<従業員>();
arraylist.add(new Employe("mateo", 32, 20000));
arraylist.add(new Employe("katia", 26, 10000));
arraylist.add(new Employe("aline", 30, 40000));
arraylist.add(new Employe("salim", 28, 35000));
//名前でソート
Collections.sort(arraylist, Employee.ComparatorName);
System.out.println("名前順の従業員リスト:");
for(Employee e:arraylist)
System.out.println(e);
//年齢でソート
Collections.sort(arraylist, Employee.ComparatorAge);
System.out.println("年齢順の従業員リスト:");
for(Employee e:arraylist)
System.out.println(e);
//給与でソート
Collections.sort(arraylist, Employee.ComparatorSalary);
System.out.println("給与順の従業員リスト:");
for(Employee e:arraylist)
System.out.println(e);
}
}
名前順の従業員リスト:
[name=aline, age=30, salary=40000]
[name=katia, age=26, salary=10000]
[name=mateo, age=32, salary=20000]
[name=サリーム, age=28, salary=35000]
年齢順の従業員一覧:
[name=katia, age=26, salary=10000]
[name=salim, age=28, salary=35000]
[name=aline, age=30, salary=40000]
[name=mateo, age=32, salary=20000]
給与順の従業員リスト:
[name=Katia, age=26, salary=10000]
[name=mateo, age=32, salary=20000]
[name=salim, age=28, salary=35000]
[name=aline, age=30, salary=40000]