JAVA開発メモ
オブジェクト配列のソート
 

[リロード]   [新規|編集|差分|添付]   [トップ|一覧|単語検索|最終更新|バックアップ|ヘルプ]

サイトメニュー
最新の20件
2018-08-012018-02-222016-12-222015-06-242013-07-032013-02-262011-01-122010-06-082010-03-092010-03-032009-12-302009-10-302009-02-252009-02-242009-02-112008-09-242008-09-232008-09-16


java.util.Comparableインタフェース

Comparableインタフェースを実装することで、オブジェクトの比較条件が指定できる。
オブジェクトの大小はcompareToメソッドの戻り値で決まる。

  • 引き数のオブジェクトより小さい場合は負の数
  • 引き数のオブジェクトと同じ場合は0
  • 引き数のオブジェクトより大きい場合は正の数

Comparableインタフェースを実装したオブジェクトソートの例

Personクラスは属性id、name、nameKanaを持つ。ソート条件はidの昇順とする。

 public class Person implements Comparable {
     private String id; // ID
     private String name; // 氏名
     private String nameKana; // カナ
 
     public Person(String id, String name, String nameKana) {
         this.id = id;
         this.name = name;
         this.nameKana = nameKana;
     }
     public String getId() {
         return id;
     }
     public String getName() {
         return name;
     }
     public String getNameKana() {
         return nameKana;
     }
      public void setId(String string) {
         id = string;
     }
     public void setName(String string) {
         name = string;
     }
     public void setNameKana(String string) {
         nameKana = string;
     }
     public String toString() {
         return "ID:" + id + " 名前:" + name + " カナ:" + nameKana;
     }
 
     public int compareTo(Object obj) {
         // IDを比較する
         return this.id.compareTo(((Person) obj).getId());
     }
 }

ソートの実行

 Person[] array = new Person[5];
 array[0] = new Person("02", "山田太郎", "ヤマダタロウ");
 array[1] = new Person("04", "吉田太郎", "ヨシダタロウ");
 array[2] = new Person("01", "川田太郎", "カワダタロウ");
 array[3] = new Person("05", "山田次郎", "ヤマダジロウ");
 array[4] = new Person("03", "山田二郎", "ヤマダジロウ");
 
 Arrays.sort(array); // 配列をソート
 
 for (int i = 0; i < array.length; i++)
     System.out.println(array[i]);

実行結果

 ID:01 名前:川田太郎 カナ:カワダタロウ
 ID:02 名前:山田太郎 カナ:ヤマダタロウ
 ID:03 名前:山田二郎 カナ:ヤマダジロウ
 ID:04 名前:吉田太郎 カナ:ヨシダタロウ
 ID:05 名前:山田次郎 カナ:ヤマダジロウ

コレクションの場合は次の通り

 List list = new ArrayList();
 
 list.add(new Person("02", "山田太郎", "ヤマダタロウ"));
 list.add(new Person("04", "吉田太郎", "ヨシダタロウ"));
 list.add(new Person("01", "川田太郎", "カワダタロウ"));
 list.add(new Person("05", "山田次郎", "ヤマダジロウ"));
 list.add(new Person("03", "山田二郎", "ヤマダジロウ"));
 
 Collections.sort(list);
 
 for (int i = 0; i < list.size(); i++)
     System.out.println(list.get(i));

java.util.Comparatorインタフェース

Comparableインタフェースが実装できない場合や複数のソート条件を使いたい場合は、Comparatorインタフェースを実装したクラスを利用する。
オブジェクトの大小はcompare(Object o1, Object o2)の戻り値で決まる。

  • o1 < o2 の場合は負の数
  • o1 = o2 の場合は0
  • o1 > o2 の場合は正の数

Comparatorインタフェースを実装したオブジェクトソートの例

ソート条件はカナの昇順でカナが同じ場合はIDの昇順とする。サンプルでは簡単に実装するために無名クラスを使用してます。

 Person[] array = new Person[5];
 array[0] = new Person("02", "山田太郎", "ヤマダタロウ");
 array[1] = new Person("04", "吉田太郎", "ヨシダタロウ");
 array[2] = new Person("01", "川田太郎", "カワダタロウ");
 array[3] = new Person("05", "山田次郎", "ヤマダジロウ");
 array[4] = new Person("03", "山田二郎", "ヤマダジロウ");
 
 Comparator asc = new Comparator() {
     public int compare(Object obj0, Object obj1) {
         String nameKana0 = ((Person) obj0).getNameKana();
         String nameKana1 = ((Person) obj1).getNameKana();
         int ret = 0;
         // カナの昇順
         if ((ret = nameKana0.compareTo(nameKana1)) == 0) {
             // カナが同じ場合はIDの昇順
             String id0 = ((Person) obj0).getId();
             String id1 = ((Person) obj1).getId();
             ret = id0.compareTo(id1);
         }
         return ret;
     }
 };
 
 Arrays.sort(array, asc); // 配列をソート
 
 for (int i = 0; i < array.length; i++)
     System.out.println(array[i]);

実行結果(カナ昇順)

 ID:01 名前:川田太郎 カナ:カワダタロウ
 ID:03 名前:山田二郎 カナ:ヤマダジロウ
 ID:05 名前:山田次郎 カナ:ヤマダジロウ
 ID:02 名前:山田太郎 カナ:ヤマダタロウ
 ID:04 名前:吉田太郎 カナ:ヨシダタロウ

ソート条件を降順にする場合は次の通り

 Comparator desc = new Comparator() {
     public int compare(Object obj0, Object obj1) {
         String nameKana0 = ((Person) obj0).getNameKana();
         String nameKana1 = ((Person) obj1).getNameKana();
         int ret = 0;
         // カナの昇順
         if ((ret = nameKana1.compareTo(nameKana0)) == 0) {
             // カナが同じ場合はIDの昇順
             String id0 = ((Person) obj0).getId();
             String id1 = ((Person) obj1).getId();
             ret = id1.compareTo(id0);
         }
         return ret;
     }
 };
 
 Arrays.sort(array, desc); // 配列をソート
 
 for (int i = 0; i < array.length; i++)
     System.out.println(array[i]);

実行結果(カナ降順)

 ID:04 名前:吉田太郎 カナ:ヨシダタロウ
 ID:02 名前:山田太郎 カナ:ヤマダタロウ
 ID:05 名前:山田次郎 カナ:ヤマダジロウ
 ID:03 名前:山田二郎 カナ:ヤマダジロウ
 ID:01 名前:川田太郎 カナ:カワダタロウ

リロード   新規 編集 差分   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: Tue, 15 Feb 2005 23:08:18 JST (5416d)
Link: 開発Tips(4101d)

Modified by MT22(Moriwaki Takashi)

"PukiWiki" 1.3.7 Copyright © 2001,2002,2003 PukiWiki Developers Team. License is GNU/GPL.
Based on "PukiWiki" 1.3 by sng
Powered by PHP 5.3.29

HTML convert time to 0.022 sec.