開発者ドキュメント

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

ドキュメンテーション]

モバイルバージョンを終了