オブジェクトの 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のリストを作成します:

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));

System.out.println("従業員の順序付きリスト:\n"+Collections.sort(arraylist));
}
}
Collections.sort()は、ComparableインタフェースとComparatorインタフェースの両方を使用しない限り機能しないオブジェクトの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<従業員>{

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);
}
}
メソッドを呼び出す権利が与えられました Collections.sort():

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;

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());
}
};
}
テストクラスmain:

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]