このページには、以下のサンプルを掲載しています。
下の項目をクリックをすると各サンプルにジャンプします。
※2週間以内の新着記事はNewアイコン、更新記事はUpアイコンが表示されます。
1. オブジェクトのソート(昇順)
オブジェクトのソートサンプルでは、2つのファイルを使用しています。
ソートを実行するクラスとソート対象となるデータオブジェクトのクラスです。
[ サンプルプログラムのソースコード - TestData.java - ]
ソート対象となるデータを保持するクラスです。
- public class TestData {
- private String name;
- private int age;
- private int number;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getNumber() {
- return number;
- }
- public void setNumber(int number) {
- this.number = number;
- }
-
- public String toString(){
- return "番号:" + number + " "
- + "名前:" + name + " " + "年齢:" + age;
- }
- }
|
[ サンプルプログラムのソースコード - ObjectSort1.java - ]
昇順ソートを行うクラスです。
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- public class ObjectSort1 {
- public static void main(String[] args) {
- ArrayList list = new ArrayList();
- TestData td;
- td = new TestData();
- td.setNumber(1);
- td.setName("Yamada");
- td.setAge(18);
- list.add(td);
-
- td = new TestData();
- td.setNumber(2);
- td.setName("Takagi");
- td.setAge(36);
- list.add(td);
-
- td = new TestData();
- td.setNumber(3);
- td.setName("Aoki");
- td.setAge(23);
- list.add(td);
-
- System.out.println("ソート前のデータ");
- int i = 1;
- for ( TestData data : list) {
-
- System.out.println("Data" + i++ + " -> " + data);
-
- }
- Collections.sort(list, new Comparator<TestData>(){
- public int compare(TestData t1, TestData t2) {
- return t1.getAge() - t2.getAge();
- }
- });
- System.out.println();
- System.out.println("年齢順ソート");
- i = 1;
- for ( TestData data : list) {
-
- System.out.println("Data" + i++ + " -> " + data);
-
- }
-
- Collections.sort(list, new Comparator<TestData>(){
- public int compare(TestData t1, TestData t2) {
- return t1.getName().compareTo(t2.getName());
- }
- });
- System.out.println();
- System.out.println("名前順ソート");
- i = 1;
- for ( TestData data : list) {
-
- System.out.println("Data" + i++ + " -> " + data);
-
- }
-
- }
- }
|
[ サンプルプログラムの実行結果 ]
ソート前のデータ
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 - ]
ソート対象となるデータクラスは、
「オブジェクトのソート(昇順)」で使ったソースファイルを使います。
ソートを実行するクラスも下記赤字の部分を変更しただけです。
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- public class ObjectSort2 {
- public static void main(String[] args) {
- ArrayList list = new ArrayList();
- TestData td;
- td = new TestData();
- td.setNumber(1);
- td.setName("Yamada");
- td.setAge(18);
- list.add(td);
-
- td = new TestData();
- td.setNumber(2);
- td.setName("Takagi");
- td.setAge(36);
- list.add(td);
-
- td = new TestData();
- td.setNumber(3);
- td.setName("Aoki");
- td.setAge(23);
- list.add(td);
-
- System.out.println("ソート前のデータ");
- int i = 1;
- for ( TestData data : list) {
-
- System.out.println("Data" + i++ + " -> " + data);
-
- }
- Collections.sort(list, new Comparator<TestData>(){
- public int compare(TestData t1, TestData t2) {
- return t2.getAge() - t1.getAge();
- }
- });
- System.out.println();
- System.out.println("年齢順ソート");
- i = 1;
- for ( TestData data : list) {
-
- System.out.println("Data" + i++ + " -> " + data);
-
- }
-
- Collections.sort(list, new Comparator<TestData>(){
- public int compare(TestData t1, TestData t2) {
- return t2.getName().compareTo(t1.getName());
- }
- });
- System.out.println();
- System.out.println("名前順ソート");
- i = 1;
- for ( TestData data : list) {
-
- System.out.println("Data" + i++ + " -> " + data);
-
- }
-
- }
- }
|
[ サンプルプログラムの実行結果 ]
ソート前のデータ
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 - ]
まずソート対象となるデータクラスを記述します。
前述のデータクラスを流用して項目を追加します。
- public class TestData2 extends TestData {
- private String name2;
-
- public String getName2() {
- return name2;
- }
- public void setName2(String name2) {
- this.name2 = name2;
- }
- public String toString(){
- return "番号:" + getNumber() + " " + "名字:" + getName() + " "
- + "名前:" + name2 + "年齢:" + getAge();
- }
- }
|
[ サンプルプログラムのソースコード - ObjectSort3.java - ]
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- public class ObjectSort3 {
- public static void main(String[] args) {
- ArrayList list = new ArrayList();
- TestData2 td;
- td = new TestData2();
- td.setNumber(1);
- td.setName("Yamada");
- td.setName2("Goro");
- td.setAge(23);
- list.add(td);
-
- td = new TestData2();
- td.setNumber(2);
- td.setName("Yamada");
- td.setName2("Taro");
- td.setAge(18);
- list.add(td);
-
- td = new TestData2();
- td.setNumber(3);
- td.setName("Takagi");
- td.setName2("Miyo");
- td.setAge(36);
- list.add(td);
-
- td = new TestData2();
- td.setNumber(4);
- td.setName("Takagi");
- td.setName2("Kayo");
- td.setAge(36);
- list.add(td);
-
- td = new TestData2();
- td.setNumber(5);
- td.setName("Aoki");
- td.setName2("Ichiro");
- td.setAge(23);
- list.add(td);
-
- td = new TestData2();
- td.setNumber(6);
- td.setName("Yamada");
- td.setName2("Ichiro");
- td.setAge(23);
- list.add(td);
-
- System.out.println("ソート前のデータ");
- int i = 1;
- for ( TestData data : list) {
-
- System.out.println("Data" + i++ + " -> " + data);
-
- }
-
- Collections.sort(list, new Comparator(){
- public int compare(TestData2 t1, TestData2 t2) {
- String t1str = String.format("$1%10s$2%10s", t1.getName(),t1.getName2());
- String t2str = String.format("$1%10s$2%10s", t2.getName(),t2.getName2());
- return t1str.compareTo(t2str);
- }
- });
- System.out.println();
- System.out.println("複合項目(名字+名前)のソート");
- i = 1;
- for ( TestData data : list) {
-
- System.out.println("Data" + i++ + " -> " + data);
-
- }
-
- }
- }
|
[ サンプルプログラムの実行結果 ]
ソート前のデータ
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メソッドの計算式を実行しています。