Java でオブジェクトの配列を並べ替える
このチュートリアルでは、Java の Comparable
インターフェースと Lambda
関数を使用してオブジェクトの配列をソートする方法を学習します。
Java で Comparable
を使ってオブジェクトの配列をソートする
Java の Comparable
インターフェイスは、ユーザー定義オブジェクトを注文するために使用されます。ここで、Student
クラスは Comparable
を実装しているため、Arrays.sort()
を使用して Student
クラスオブジェクトの配列を並べ替えることができます。
Student
クラスには、name
、age
、および gender
の 3つのメンバー変数があります。これらのデータメンバーのみに基づいて要素を並べ替えます。
Comparable インターフェースには、compareTo()
という 1つのメソッドがあります。例でわかるように、Student
クラスはこのメソッドを実装しています。
compareTo()
メソッドは、現在のオブジェクトを指定されたオブジェクトでソートするために使用され、現在のオブジェクトが現在のオブジェクトよりも大きい場合は正の整数を返します。現在のオブジェクトが指定されたオブジェクトよりも小さい場合、負の整数を返します。ゼロが返された場合、現在のオブジェクトは指定されたオブジェクトと同等です。
Student
クラスオブジェクトの配列を作成しました。name
、age
、および gender
を引数として渡して、クラスのデフォルトコンストラクターを使用してそれらを初期化しました。
Student
クラスの compareTo()
メソッドでわかるように、配列は最初に age
、次に name
の順に並べられます。students
配列を Arrays.sort()
に渡します。
ソートされた配列をこの形式で出力するには、Student
クラスの toString()
メソッドをオーバーライドします。
import java.util.Arrays;
class Student implements Comparable<Student> {
private String name;
private int age;
private String gender;
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "{"
+ "name='" + name + '\'' + ", gender: " + gender + ", "
+ "age=" + age + '}';
}
public int getAge() {
return age;
}
public String getGender() {
return gender;
}
public String getName() {
return name;
}
@Override
public int compareTo(Student o) {
if (this.age != o.getAge()) {
return this.age - o.getAge();
}
return this.name.compareTo(o.getName());
}
}
public class TestExample {
public static void main(String[] args) {
Student[] students = {new Student("Jack", 25, "male"), new Student("Sandy", 20, "female"),
new Student("Danny", 22, "male"), new Student("Zoey", 10, "female")};
Arrays.sort(students);
System.out.println(Arrays.toString(students));
}
}
出力:
[{name='Zoey', gender: female, age=10}, {name='Sandy', gender: female, age=20}, {name='Danny', gender: male, age=22}, {name='Jack', gender: male, age=25}]
Java でオブジェクトの配列をソートするためのラムダの使用
オブジェクトの配列のソートは、Comparable
インターフェースを実装しなくても、Java 8 の Lambda
関数を使用すると簡単になります。
ここには、メンバー変数 bookName
と author
を持つ Books
ユーザークラスがあります。デフォルトのコンストラクターは、これらのデータメンバーを初期化します。
これらのメンバーにアクセスするための getter メソッドと setter メソッドも、Book
クラスで定義されています。List
インターフェースは sort()
メソッドをサポートします。
ここで、bookList
は Books
クラスオブジェクトを含むリストのインスタンスです。リストを作成者で並べ替えるラムダ式は、(Books a , Books b) -> a.getAuthor().compareTo(b.getAuthor())
です。
メソッド sort()
はソートされたリストを返し、そのリストをループして各要素を出力します。ソートされたリストが出力に出力されます。
import java.util.ArrayList;
import java.util.List;
class Books {
String bookName;
String author;
public Books(String bookName, String author) {
this.bookName = bookName;
this.author = author;
}
@Override
public String toString() {
return "{"
+ "Book ='" + bookName + '\'' + ", author = '" + author + '\'' + "}";
}
public String getAuthor() {
return author;
}
public String getBookName() {
return bookName;
}
}
public class ExampleObjectSort {
public static void main(String[] args) {
List<Books> bookList = new ArrayList<>();
bookList.add(new Books("Barney's Version", "Mordecai Richler"));
bookList.add(new Books("The Unsettlers", "Mark Sundeen"));
bookList.add(new Books("The Debt to Pleasure", "John Lanchester"));
bookList.add(new Books("How to Do Nothing", "Jenny Odell"));
System.out.println("Before Sorting");
bookList.forEach((s) -> System.out.println(s));
System.out.println("");
System.out.println("Sorted Books by author Using Lambda.");
bookList.sort((Books a, Books b) -> a.getAuthor().compareTo(b.getAuthor()));
bookList.forEach((s) -> System.out.println(s));
}
}
出力:
Before Sorting
{Book ='Barney's Version', author = 'Mordecai Richler'}
{Book ='The Unsettlers', author = 'Mark Sundeen'}
{Book ='The Debt to Pleasure', author = 'John Lanchester'}
{Book ='How to Do Nothing', author = 'Jenny Odell'}
Sorted Books by author Using Lambda.
{Book ='How to Do Nothing', author = 'Jenny Odell'}
{Book ='The Debt to Pleasure', author = 'John Lanchester'}
{Book ='The Unsettlers', author = 'Mark Sundeen'}
{Book ='Barney's Version', author = 'Mordecai Richler'}
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn関連記事 - Java Array
- Java で 16 進文字列のバイト配列を変換する方法
- Java で 2つの配列を連結する方法
- Java の配列から重複を削除する
- Java で 2D 配列を埋める
- Java で配列のサブセットを取得する
- Java の自然順序付け