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
ドキュメンテーション]