Home > プログラミング > [Java]ArrayListの中身をソートする

[Java]ArrayListの中身をソートする

ArrayListの中身をソートする方法を覚えたのでメモ。
もう忘れないぞー!

サンプルコードを以下に示します。

SortTest.java

mainメソッドを含むクラス。
Collecttionsクラスのsortメソッドに、ArrayListのオブジェクトと、ソートのルールを記述した無名インナークラスのオブジェクトを引数として渡しています。

引数として与えたArrayListのオブジェクトの中身が、メソッド終了時にはソートされた状態になっています。
sortメソッドは何も返さないので注意!

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortTest {
	public static void main (String args[]) {
		// ArrayListを作成
		List<TestClass> list = new ArrayList<TestClass>();
		
		// ArrayListに格納するオブジェクトを作成
		TestClass tc1 = new TestClass();
		TestClass tc2 = new TestClass();
		TestClass tc3 = new TestClass();
		TestClass tc4 = new TestClass();
		
		// オブジェクトに名前をセット
		tc1.setName("zzz");
		tc2.setName("bbb");
		tc3.setName("ppp");
		tc4.setName("jjj");
		
		// オブジェクトに値をセット
		tc1.setValue(4);
		tc2.setValue(6);
		tc3.setValue(1);
		tc4.setValue(3);
		
		// オブジェクトをArrayListに格納
		list.add(tc1);
		list.add(tc2);
		list.add(tc3);
		list.add(tc4);
		
		// ArrayListの内容を表示
		System.out.println("----- 初期状態 -----");
		for(TestClass tc : list) {
			System.out.println("name: " + tc.getName() + " value: " + tc.getValue());
		}
		
		// nameの昇順でソート
		Collections.sort(list, new Comparator<TestClass>() {
			public int compare(TestClass tc1, TestClass tc2) {
				String tc1Name = tc1.getName();
				String tc2Name = tc2.getName();
				if (tc1Name.compareTo(tc2Name) < 0) {
					return -1;
				} else if (tc1Name.compareTo(tc2Name) > 0) {
					return 1;
				}
				return 0;
			}
		});
		
		// ArrayListの内容を表示
		System.out.println("\n----- nameでソート -----");
		for(TestClass tc : list) {
			System.out.println("name: " + tc.getName() + " value: " + tc.getValue());
		}

		// valueの昇順でソート
		Collections.sort(list, new Comparator<TestClass>() {
			public int compare(TestClass tc1, TestClass tc2) {
				int tc1Value = tc1.getValue();
				int tc2Value = tc2.getValue();
				if (tc1Value < tc2Value) {
					return -1;
				} else if (tc1Value > tc2Value) {
					return 1;
				}
				return 0;
			}
		});
		
		// ArrayListの内容を表示
		System.out.println("\n----- valueでソート -----");
		for(TestClass tc : list) {
			System.out.println("name: " + tc.getName() + " value: " + tc.getValue());
		}
	}
}

TestClass.java

ArrayListに格納するオブジェクトのクラス。

public class TestClass {
	private String name;
	private int value;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
}

実行結果

きちんとソートされているのがわかります。

----- 初期状態 -----
name: zzz value: 4
name: bbb value: 6
name: ppp value: 1
name: jjj value: 3

----- nameでソート -----
name: bbb value: 6
name: jjj value: 3
name: ppp value: 1
name: zzz value: 4

----- valueでソート -----
name: ppp value: 1
name: jjj value: 3
name: zzz value: 4
name: bbb value: 6

まとめ

無名インナークラスを使う事で、ソートのルールを記述する用のクラスを作成しなくてもよくなり。
手間が省けていい!

もっと上手い方法があればどなたか教えてください!

Comments:2

ms 2008年5月 8日 10:44

はじめまして、

オブジェクトソートについては、リフレクションを利用する事で、毎回ソート用の
クラスを作成しなくて済むようにした汎用プログラムを作成しました。
下記のサイトからダウンロードできるようにしています。

http://www.opensystem.co.jp/html/Generalprogram.html

詳細は、まだアップできていないのですが、使用方法は簡単ですよ。

kadoppe Author Profile Page 2008年5月22日 10:03

>msさん
はじめまして!コメントありがとうございます!
毎回ソート用のクラスを作成するのは確かに面倒なので、喜んで使わせていただきたいと思います!
ご紹介ありがとうございました!

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://www.kadoppe.net/mt/mt-tb.cgi/117
Listed below are links to weblogs that reference
[Java]ArrayListの中身をソートする from CreativeStyle

Home > プログラミング > [Java]ArrayListの中身をソートする

Search
Feeds
Blog Parts

あわせて読みたい フィードメーター - CreativeStyle この日記のはてなブックマーク数 kadoppeさんの体重グラフ

Return to page top