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のデータを順々に表示していきます。
こんなかんじ。。。ですかね。。