データオブジェクトのソート方法

オブジェクトのソートに関するJavaサンプルを掲載しています。

Home > サンプル集 > Javaサンプル集 > オブジェクトのソート


オブジェクトのソート

このページには、以下のサンプルを掲載しています。 下の項目をクリックをすると各サンプルにジャンプします。 ※2週間以内の新着記事はNewアイコン、更新記事はUpアイコンが表示されます。
  1. オブジェクトのソート(昇順)( ObjectSort1.java )  
  2. オブジェクトのソート(降順))( ObjectSort2.java )  
  3. 複数項目のソート)( ObjectSort3.java )  

1. オブジェクトのソート(昇順)


オブジェクトのソートサンプルでは、2つのファイルを使用しています。
ソートを実行するクラスとソート対象となるデータオブジェクトのクラスです。
[ サンプルプログラムのソースコード - TestData.java - ]
ソート対象となるデータを保持するクラスです。
  1. public class TestData {
  2.   private String name;
  3.   private int age;
  4.   private int number;
  5.   public int getAge() {
  6.     return age;
  7.   }
  8.   public void setAge(int age) {
  9.     this.age = age;
  10.   }
  11.   public String getName() {
  12.     return name;
  13.   }
  14.   public void setName(String name) {
  15.     this.name = name;
  16.   }
  17.   public int getNumber() {
  18.     return number;
  19.   }
  20.   public void setNumber(int number) {
  21.     this.number = number;
  22.   }
  23.   
  24.   public String toString(){
  25.     return "番号:" + number + " " 
  26.        + "名前:" + name + " " + "年齢:" + age; 
  27.   }
  28. }

[ サンプルプログラムのソースコード - ObjectSort1.java - ]
昇順ソートを行うクラスです。
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. public class ObjectSort1 {
  5.   public static void main(String[] args) {
  6.     ArrayList list = new ArrayList();
  7.     TestData td;
  8.     td = new TestData();
  9.     td.setNumber(1);
  10.     td.setName("Yamada");
  11.     td.setAge(18);
  12.     list.add(td);
  13.     
  14.     td = new TestData();
  15.     td.setNumber(2);
  16.     td.setName("Takagi");
  17.     td.setAge(36);
  18.     list.add(td);
  19.     
  20.     td = new TestData();
  21.     td.setNumber(3);
  22.     td.setName("Aoki");
  23.     td.setAge(23);
  24.     list.add(td);
  25.     
  26.     System.out.println("ソート前のデータ");
  27.     int i = 1;
  28.     for ( TestData data : list) {
  29.       
  30.       System.out.println("Data" + i++ + " -> " + data);
  31.       
  32.     }
  33.     Collections.sort(list, new Comparator<TestData>(){
  34.       public int compare(TestData t1, TestData t2) {
  35.         return t1.getAge() - t2.getAge();
  36.       }
  37.     });
  38.     System.out.println();
  39.     System.out.println("年齢順ソート");
  40.     i = 1;
  41.     for ( TestData data : list) {
  42.       
  43.       System.out.println("Data" + i++ + " -> " + data);
  44.       
  45.     }
  46.     
  47.     Collections.sort(list, new Comparator<TestData>(){
  48.       public int compare(TestData t1, TestData t2) {
  49.         return t1.getName().compareTo(t2.getName());
  50.       }
  51.     });
  52.     System.out.println();
  53.     System.out.println("名前順ソート");
  54.     i = 1;
  55.     for ( TestData data : list) {
  56.       
  57.       System.out.println("Data" + i++ + " -> " + data);
  58.       
  59.     }
  60.     
  61.   }
  62. }
[ サンプルプログラムの実行結果 ]
ソート前のデータ
Data1 -> 番号:1 名前:Yamada 年齢:18
Data2 -> 番号:2 名前:Takagi 年齢:36
Data3 -> 番号:3 名前:Aoki 年齢:23

年齢順ソート
Data1 -> 番号:1 名前:Yamada 年齢:18
Data2 -> 番号:3 名前:Aoki 年齢:23
Data3 -> 番号:2 名前:Takagi 年齢:36

名前順ソート
Data1 -> 番号:3 名前:Aoki 年齢:23
Data2 -> 番号:2 名前:Takagi 年齢:36
Data3 -> 番号:1 名前:Yamada 年齢:18
[ サンプルプログラムの解説 ]
サンプルソースの赤字部分は、年齢順のソート処理をしています。青字部分は名前順のソート処理をしています。 Collectionクラスのsortメソッドの第2引数にcompareメソッドをオーバーライドしたComparatorオブジェクトを 指定します。


2. オブジェクトのソート(降順)


[ サンプルプログラムのソースコード - ObjectSort2.java - ]
ソート対象となるデータクラスは、「オブジェクトのソート(昇順)」で使ったソースファイルを使います。 ソートを実行するクラスも下記赤字の部分を変更しただけです。
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. public class ObjectSort2 {
  5.   public static void main(String[] args) {
  6.     ArrayList list = new ArrayList();
  7.     TestData td;
  8.     td = new TestData();
  9.     td.setNumber(1);
  10.     td.setName("Yamada");
  11.     td.setAge(18);
  12.     list.add(td);
  13.     
  14.     td = new TestData();
  15.     td.setNumber(2);
  16.     td.setName("Takagi");
  17.     td.setAge(36);
  18.     list.add(td);
  19.     
  20.     td = new TestData();
  21.     td.setNumber(3);
  22.     td.setName("Aoki");
  23.     td.setAge(23);
  24.     list.add(td);
  25.     
  26.     System.out.println("ソート前のデータ");
  27.     int i = 1;
  28.     for ( TestData data : list) {
  29.       
  30.       System.out.println("Data" + i++ + " -> " + data);
  31.       
  32.     }
  33.     Collections.sort(list, new Comparator<TestData>(){
  34.       public int compare(TestData t1, TestData t2) {
  35.         return t2.getAge() - t1.getAge();
  36.       }
  37.     });
  38.     System.out.println();
  39.     System.out.println("年齢順ソート");
  40.     i = 1;
  41.     for ( TestData data : list) {
  42.       
  43.       System.out.println("Data" + i++ + " -> " + data);
  44.       
  45.     }
  46.     
  47.     Collections.sort(list, new Comparator<TestData>(){
  48.       public int compare(TestData t1, TestData t2) {
  49.         return t2.getName().compareTo(t1.getName());
  50.       }
  51.     });
  52.     System.out.println();
  53.     System.out.println("名前順ソート");
  54.     i = 1;
  55.     for ( TestData data : list) {
  56.       
  57.       System.out.println("Data" + i++ + " -> " + data);
  58.       
  59.     }
  60.     
  61.   }
  62. }
[ サンプルプログラムの実行結果 ]
ソート前のデータ
Data1 -> 番号:1 名前:Yamada 年齢:18
Data2 -> 番号:2 名前:Takagi 年齢:36
Data3 -> 番号:3 名前:Aoki 年齢:23

年齢順ソート
Data1 -> 番号:2 名前:Takagi 年齢:36
Data2 -> 番号:3 名前:Aoki 年齢:23
Data3 -> 番号:1 名前:Yamada 年齢:18

名前順ソート
Data1 -> 番号:1 名前:Yamada 年齢:18
Data2 -> 番号:2 名前:Takagi 年齢:36
Data3 -> 番号:3 名前:Aoki 年齢:23
[ サンプルプログラムの解説 ]
昇順ソートのサンプルから上記赤字部分のように変更すると降順ソートとなります。計算式の順番を前後逆にしただけです。


3. 複数項目のソート

[ サンプルプログラムのソースコード - TestData2.java - ]
まずソート対象となるデータクラスを記述します。
前述のデータクラスを流用して項目を追加します。
  1. public class TestData2 extends TestData {
  2.   private String name2;
  3.   
  4.   public String getName2() {
  5.     return name2;
  6.   }
  7.   public void setName2(String name2) {
  8.     this.name2 = name2;
  9.   }
  10.   public String toString(){
  11.     return "番号:" + getNumber() + " " + "名字:" + getName() + " "
  12.              + "名前:" + name2 + "年齢:" + getAge(); 
  13.   }
  14. }
[ サンプルプログラムのソースコード - ObjectSort3.java - ]
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. public class ObjectSort3 {
  5.   public static void main(String[] args) {
  6.     ArrayList list = new ArrayList();
  7.     TestData2 td;
  8.     td = new TestData2();
  9.     td.setNumber(1);
  10.     td.setName("Yamada");
  11.     td.setName2("Goro");
  12.     td.setAge(23);
  13.     list.add(td);
  14.     
  15.     td = new TestData2();
  16.     td.setNumber(2);
  17.     td.setName("Yamada");
  18.     td.setName2("Taro");
  19.     td.setAge(18);
  20.     list.add(td);
  21.     
  22.     td = new TestData2();
  23.     td.setNumber(3);
  24.     td.setName("Takagi");
  25.     td.setName2("Miyo");
  26.     td.setAge(36);
  27.     list.add(td);
  28.     
  29.     td = new TestData2();
  30.     td.setNumber(4);
  31.     td.setName("Takagi");
  32.     td.setName2("Kayo");
  33.     td.setAge(36);
  34.     list.add(td);
  35.     
  36.     td = new TestData2();
  37.     td.setNumber(5);
  38.     td.setName("Aoki");
  39.     td.setName2("Ichiro");
  40.     td.setAge(23);
  41.     list.add(td);
  42.     
  43.     td = new TestData2();
  44.     td.setNumber(6);
  45.     td.setName("Yamada");
  46.     td.setName2("Ichiro");
  47.     td.setAge(23);
  48.     list.add(td);
  49.     
  50.     System.out.println("ソート前のデータ");
  51.     int i = 1;
  52.     for ( TestData data : list) {
  53.       
  54.       System.out.println("Data" + i++ + " -> " + data);
  55.       
  56.     }
  57.     
  58.     Collections.sort(list, new Comparator(){
  59.       public int compare(TestData2 t1, TestData2 t2) {
  60.         String t1str = String.format("$1%10s$2%10s", t1.getName(),t1.getName2());
  61.         String t2str = String.format("$1%10s$2%10s", t2.getName(),t2.getName2());
  62.         return t1str.compareTo(t2str);
  63.       }
  64.     });
  65.     System.out.println();
  66.     System.out.println("複合項目(名字+名前)のソート");
  67.     i = 1;
  68.     for ( TestData data : list) {
  69.       
  70.       System.out.println("Data" + i++ + " -> " + data);
  71.       
  72.     }
  73.     
  74.   }
  75. }
[ サンプルプログラムの実行結果 ]
ソート前のデータ
Data1 -> 番号:1 名字:Yamada 名前:Goro年齢:23
Data2 -> 番号:2 名字:Yamada 名前:Taro年齢:18
Data3 -> 番号:3 名字:Takagi 名前:Miyo年齢:36
Data4 -> 番号:4 名字:Takagi 名前:Kayo年齢:36
Data5 -> 番号:5 名字:Aoki 名前:Ichiro年齢:23
Data6 -> 番号:6 名字:Yamada 名前:Ichiro年齢:23

複合項目(名字+名前)のソート
Data1 -> 番号:5 名字:Aoki 名前:Ichiro年齢:23
Data2 -> 番号:4 名字:Takagi 名前:Kayo年齢:36
Data3 -> 番号:3 名字:Takagi 名前:Miyo年齢:36
Data4 -> 番号:1 名字:Yamada 名前:Goro年齢:23
Data5 -> 番号:2 名字:Yamada 名前:Taro年齢:18
Data6 -> 番号:6 名字:Yamada 名前:Ichiro年齢:23
[ サンプルプログラムの解説 ]
このサンプルでは、名字と名前の項目を連結した上でcompareメソッドの計算式を実行しています。




最終更新日:2019/02/13

2015-03-01からの訪問者数
  1222 人