Javaオブジェクトのソートの例(ComparableとComparator)
このチュートリアルでは、
java.lang.Comparable
および
java.util.Comparator
を使用して、プロパティ値に基づいてJavaオブジェクトをソートする方法を示します。
1.配列をソートする
配列をソートするには、
Arrays.sort()
を使用します。
String[]fruits = new String[]{"Pineapple","Apple", "Orange", "Banana"};
Arrays.sort(fruits);
int i=0;
for(String temp: fruits){
System.out.println("fruits " + ++i + " : " + temp);
}
出力
fruits 1 : Apple fruits 2 : Banana fruits 3 : Orange fruits 4 : Pineapple
2. ArrayListをソートする
ArrayListをソートするには、
Collections.sort()
を使用します。
List<String> fruits = new ArrayList<String>();
fruits.add("Pineapple");
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Banana");
Collections.sort(fruits);
int i=0;
for(String temp: fruits){
System.out.println("fruits " + ++i + " : " + temp);
}
出力
fruits 1 : Apple fruits 2 : Banana fruits 3 : Orange fruits 4 : Pineapple
3. Comparableでオブジェクトをソートする
Javaオブジェクトはどうですか? Fruitクラスを作成しましょう:
public class Fruit{
private String fruitName;
private String fruitDesc;
private int quantity;
public Fruit(String fruitName, String fruitDesc, int quantity) {
super();
this.fruitName = fruitName;
this.fruitDesc = fruitDesc;
this.quantity = quantity;
}
public String getFruitName() {
return fruitName;
}
public void setFruitName(String fruitName) {
this.fruitName = fruitName;
}
public String getFruitDesc() {
return fruitDesc;
}
public void setFruitDesc(String fruitDesc) {
this.fruitDesc = fruitDesc;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}
ソートするには、
Arrays.sort()
をもう一度考えてみてください。以下の例を参照してください:
package com.mkyong.common.action;
import java.util.Arrays;
public class SortFruitObject{
public static void main(String args[]){
Fruit[]fruits = new Fruit[4];
Fruit pineappale = new Fruit("Pineapple", "Pineapple description",70);
Fruit apple = new Fruit("Apple", "Apple description",100);
Fruit orange = new Fruit("Orange", "Orange description",80);
Fruit banana = new Fruit("Banana", "Banana description",90);
fruits[0]=pineappale;
fruits[1]=apple;
fruits[2]=orange;
fruits[3]=banana;
Arrays.sort(fruits);
int i=0;
for(Fruit temp: fruits){
System.out.println("fruits " + ++i + " : " + temp.getFruitName() +
", Quantity : " + temp.getQuantity());
}
}
}
素敵な試みですが、
Arrays.sort()
は何をしますか?あなたは、Fruitクラスで何を並べるべきかについて言及していませんでした。したがって、次のエラーが発生します:
Exception in thread "main" java.lang.ClassCastException:
com.mkyong.common.Fruit cannot be cast to java.lang.Comparable
at java.util.Arrays.mergeSort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
プロパティでオブジェクトをソートするには、Objectを
Comparable
インターフェイスを実装して
compareTo()
メソッドをオーバーライドする必要があります。新しいFruitクラスをもう一度見てみましょう。
public class Fruit implements Comparable<Fruit>{
private String fruitName;
private String fruitDesc;
private int quantity;
public Fruit(String fruitName, String fruitDesc, int quantity) {
super();
this.fruitName = fruitName;
this.fruitDesc = fruitDesc;
this.quantity = quantity;
}
public String getFruitName() {
return fruitName;
}
public void setFruitName(String fruitName) {
this.fruitName = fruitName;
}
public String getFruitDesc() {
return fruitDesc;
}
public void setFruitDesc(String fruitDesc) {
this.fruitDesc = fruitDesc;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public int compareTo(Fruit compareFruit) {
int compareQuantity = ((Fruit) compareFruit).getQuantity();
//ascending order
return this.quantity - compareQuantity;
//descending order
//return compareQuantity - this.quantity;
}
}
新しいFruitクラスは
Comparable
インターフェイスを実装し、
compareTo()
メソッドをオーバーライドして、quantityプロパティを昇順で比較しました。
compareTo()メソッドの詳細については、http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html[Comparable documentation]を参照してください。
もう一度やり直すと、Fruits配列は数量で昇順にソートされます。
fruits 1 : Pineapple, Quantity : 70 fruits 2 : Orange, Quantity : 80 fruits 3 : Banana, Quantity : 90 fruits 4 : Apple, Quantity : 100
4.コンパレータでオブジェクトをソートする
フルーツの「fruitName」や「Quantity」でソートするのはどうですか? Comparableインターフェイスでは、単一のプロパティをソートすることしかできません。複数のプロパティでソートするには、
Comparator
が必要です。新しい更新されたFruitクラスをもう一度見てください:
import java.util.Comparator;
public class Fruit implements Comparable<Fruit>{
private String fruitName;
private String fruitDesc;
private int quantity;
public Fruit(String fruitName, String fruitDesc, int quantity) {
super();
this.fruitName = fruitName;
this.fruitDesc = fruitDesc;
this.quantity = quantity;
}
public String getFruitName() {
return fruitName;
}
public void setFruitName(String fruitName) {
this.fruitName = fruitName;
}
public String getFruitDesc() {
return fruitDesc;
}
public void setFruitDesc(String fruitDesc) {
this.fruitDesc = fruitDesc;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public int compareTo(Fruit compareFruit) {
int compareQuantity = ((Fruit) compareFruit).getQuantity();
//ascending order
return this.quantity - compareQuantity;
//descending order
//return compareQuantity - this.quantity;
}
public static Comparator<Fruit> FruitNameComparator
= new Comparator<Fruit>() {
public int compare(Fruit fruit1, Fruit fruit2) {
String fruitName1 = fruit1.getFruitName().toUpperCase();
String fruitName2 = fruit2.getFruitName().toUpperCase();
//ascending order
return fruitName1.compareTo(fruitName2);
//descending order
//return fruitName2.compareTo(fruitName1);
}
};
}
Fruitクラスには、 “fruitName”を比較する静的
FruitNameComparator
メソッドが含まれています。これで、Fruitオブジェクトは “quantity”または “fruitName”プロパティのいずれかでソートできます。もう一度実行してください。
{空} 1。 fruitNameプロパティに基づいて、フルーツ配列を昇順でソートします。
Arrays.sort(fruits, Fruit.FruitNameComparator);
出力
fruits 1 : Apple, Quantity : 100 fruits 2 : Banana, Quantity : 90 fruits 3 : Orange, Quantity : 80 fruits 4 : Pineapple, Quantity : 70
{空} 2。 「量」プロパティに基づいて、フルーツアレイを昇順にソートします。
Arrays.sort(fruits)
出力
fruits 1 : Pineapple, Quantity : 70 fruits 2 : Orange, Quantity : 80 fruits 3 : Banana, Quantity : 90 fruits 4 : Apple, Quantity : 100
-
java.lang.Comparable
と
java.util.Comparator ** は強力ですが、それを理解して使用するのに時間がかかります。詳細の例が不足している可能性があります。
私の考え…
将来的には、Arraysクラスはもっと汎用的で便利なメソッドを提供するはずです。
Arrays.sort(Object、String、flag)
。
オブジェクト配列を “fruitName”で昇順にソートする。
Arrays.sort(fruits, fruitName, Arrays.ASCENDING);
“量”によってオブジェクト配列を昇順にソートする。
Arrays.sort(fruits, quantity, Arrays.DESCENDING);
リファレンス
ドキュメンテーション]。
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Comparator.html
[Comparator
ドキュメンテーション]