ウィリアムのいたずらの、まちあるき、たべあるきーPART2

gooブログ「ウィリアムのいたずらの、まちあるき、たべあるき」がお引越ししてきました

Javaで基本操作(その2):ソートする


Javaで基本操作シリーズ、前回はマージだったので、今日はソートです。

ソートはJavaの場合、Arrays.sort(キーの配列)でソートしてくれます。

なので、こんなかんじで、ソートできます。


●仕様1
 キーは、時間、値は1レコード分のデータ(下記)を、レコード数分、ハッシュマップに入れて、時間の昇順にソートして出力する。

  1レコード分のデータの構造は
    キーに時間(time)、チャンネル(ch)、番組名(title)、
    値にそれぞれの値を入れた
  HashMap。

●ソース1
import java.util.*;

/*
 *  Sortのテスト
 */
public class test {
	/*
	 * 	メイン処理(呼び出し元)
	 */
	public static void main(String[] args) {
		HashMap moto = new HashMap(); //	元のデータ(ここに追加する)
		HashMap henko= new HashMap(); //	変更分データ
		HashMap rec;		   // 1レコード分データ

		//	データ
		rec = new HashMap();
		rec.put("time","19:00");
		rec.put("ch","8");
		rec.put("title","バレーボール");
		moto.put("19:00",rec);

		rec = new HashMap();
		rec.put("time","23:00");
		rec.put("ch","12");
		rec.put("title","WBS土曜版");
		moto.put("23:00",rec);

		rec = new HashMap();
		rec.put("time","24:00");
		rec.put("ch","4");
		rec.put("title","うるぐす");
		moto.put("24:00",rec);

		rec = new HashMap();
		rec.put("time","26:30");
		rec.put("ch","3");
		rec.put("title","平野麻樹子の地学");
		moto.put("26:30",rec);
		
		//	ソートする
		Object[] key = moto.keySet().toArray();
		Arrays.sort(key);
		
		//	表示する
		for(int i = 0 ; i < key.length ; i ++ )
		{
			rec	=	(HashMap)moto.get(key[i]);
			System.out.println(rec.get("time") + " " + 
                               rec.get("ch") + ":" +rec.get("title"));
		}					
	}
}

(上記< > ¥は、本当は半角です)

つまり、
  Object[] key = moto.keySet().toArray();
で、ソート対象のキーを取り出し
  Arrays.sort(key);
でソートします




 これが、降順の場合は、
 // 表示する
 for(int i = 0 ; i <key.length ; i ++ ) が

 // 表示する
 for(int i = key.length-1 ; i >= 0 ; i -- )
にかわるだけです。




 キーが数字の場合は、前に0を足して桁数を揃えます。
 (そうしないと、文字列でやった場合、正しくソートしません。
  KeyがIntegerのオブジェクトでやるなら、足さなくてもいいですが)

 キーが、大項目、中項目、小項目とあるとき、タブまたは空白でつなぎます。
 (空白を使っていない場合は空白でOK。キー項目に空白がある場合はタブ)


●仕様2
 キーは、時間、値は1レコード分のデータ(下記)を、レコード数分、ハッシュマップに入れて、チャンネル番号、時間の昇順にソートして出力する。

  1レコード分のデータの構造は
    キーに時間(time)、チャンネル(ch)、番組名(title)、
    値にそれぞれの値を入れた
  HashMap。

●ソース2
import java.util.*;
import java.text.*;

/*
 *  Sortのテスト
 */
public class test {
	/*
	 * 	メイン処理(呼び出し元)
	 */
	public static void main(String[] args) {
		HashMap moto = new HashMap(); //	元のデータ(ここに追加する)
		HashMap henko= new HashMap(); //	変更分データ
		HashMap rec;		   //	1レコード分データ

		NumberFormat nf = NumberFormat.getInstance();
		nf.setMinimumIntegerDigits(2); //	2桁で表示
		
		//	データ
		rec = new HashMap();
		rec.put("time","19:00");
		rec.put("ch","8");
		rec.put("title","バレーボール");
		moto.put(nf.format(8)+ "¥t"+"19:00",rec);

		rec = new HashMap();
		rec.put("time","23:00");
		rec.put("ch","12");
		rec.put("title","WBS土曜版");
		moto.put(nf.format(12)+ "¥t"+"23:00",rec);

		rec = new HashMap();
		rec.put("time","24:00");
		rec.put("ch","4");
		rec.put("title","うるぐす");
		moto.put(nf.format(4)+ "¥t"+"24:00",rec);

		rec = new HashMap();
		rec.put("time","26:30");
		rec.put("ch","3");
		rec.put("title","平野麻樹子の地学");
		moto.put(nf.format(3)+ "¥t"+"26:30",rec);
		
		//	ソートする
		Object[] key = moto.keySet().toArray();
		Arrays.sort(key);
		
		//	表示する
		for(int i = 0 ; i < key.length ; i ++ )
		{
			rec	=	(HashMap)moto.get(key[i]);
			System.out.println(key[i] + ":" +
                                rec.get("title"));
		}					
	}
}

(上記< > ¥は、本当は半角です)

キーの入れ方が仕様1と変わっています。

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumIntegerDigits(2); // 2桁で表示

で2桁表示にして、
  nf.format(チャンネル番号)
で、2桁でチャンネル番号をあらわしています(1桁だと前0がつく)





 1つのキーに対して、レコードがいくつもある場合は、
 キーは、ソートキー、値はそのキーが入ったレコードのVectorにして
 そのVectorに、各レコードのハッシュマップを入れます。

●仕様3
 キーは、時間、値は1レコード分のデータ(下記)を、レコード数分、ハッシュマップに入れて、時間の昇順にソートして出力する。ただし、時間は、同じ時間のものがある。その場合のソート順は問わない。

●ソース3
import java.util.*;
import java.text.*;

/*
 *  Sortのテスト
 */
public class test {
	/*
	 * 	メイン処理(呼び出し元)
	 */
	public static void main(String[] args) {
		HashMap moto = new HashMap(); // 元のデータ(ここに追加する)
		HashMap henko= new HashMap(); //	変更分データ
		HashMap rec;		  //	1レコード分データ
	         Vector  vec;	//	レコードが入ったベクター

		
		//	データ
		rec = new HashMap();
		rec.put("time","19:00");
		rec.put("ch","8");
		rec.put("title","バレーボール");
		vec = (Vector)moto.get("19:00");
		if ( vec	==	null )
		{
			vec	=	new Vector();
		}
		vec.add(rec);
		moto.put("19:00",vec);

		rec = new HashMap();
		rec.put("time","23:00");
		rec.put("ch","12");
		rec.put("title","WBS土曜版");
		vec = (Vector)moto.get("23:00");
		if ( vec	==	null )
		{
			vec	=	new Vector();
		}
		vec.add(rec);
		moto.put("23:00",vec);
		
		rec = new HashMap();
		rec.put("time","24:00");
		rec.put("ch","4");
		rec.put("title","うるぐす");
		vec = (Vector)moto.get("24:00");
		if ( vec	==	null )
		{
			vec	=	new Vector();
		}
		vec.add(rec);
		moto.put("24:00",vec);

		rec = new HashMap();
		rec.put("time","26:30");
		rec.put("ch","3");
		rec.put("title","平野麻樹子の地学");
		vec = (Vector)moto.get("26:30");
		if ( vec	==	null )
		{
			vec	=	new Vector();
		}
		vec.add(rec);
		moto.put("26:30",vec);

		rec = new HashMap();
		rec.put("time","19:00");
		rec.put("ch","3");
		rec.put("title","サイエンスZERO");
		vec = (Vector)moto.get("19:00");
		if ( vec	==	null )
		{
			vec	=	new Vector();
		}
		vec.add(rec);
		moto.put("19:00",vec);
		
		//	ソートする
		Object[] key = moto.keySet().toArray();
		Arrays.sort(key);
		
		//	表示する
		for(int i = 0 ; i < key.length ; i ++ )
		{
			vec	=	(Vector)moto.get(key[i]);
			if (vec	==	null )
				continue;
			for(int j = 0 ; j < vec.size() ; j ++ )
			{
				rec = (HashMap)vec.elementAt(j);
				System.out.println(rec.get("time")+ " "
                                     + rec.get("ch") + ":" +rec.get("title"));
			}
		}					
	}
}


(上記< > ¥は、本当は半角です)

データを入れるところが違って、
 vec = (Vector)moto.get("19:00");
という形で、今、いれようとするところのVectorを
とってきます。新規のときはnullになるので
 if ( vec == null )
 {
  vec = new Vector();
 }
で生成したあとに

 vec.add(rec);

で、レコードを追加、このVectorを
 moto.put(時間,vec);
でPutします

取り出すときは、
いちど、Vectorを取得し、そのVectorのデータを順々に表示していきます。




こんなかんじ。。。ですかね。。