処理概要を考える
共通処理になりそうな「並び替え」、「カンマ形式」から作っていきます。今回、並び替えが必要なのは、「購入」(価格が高い順に購入)、「収入リスト表示」(手数料の多い順に表示)の2か所です。これらが汎用的に利用できるように処理を考えます。また、並べ替えの手法は複数ありますが、今回はシンプルな「バブルソート」を用います。
バブルソート
小さい順に並び変える場合は、一番小さい数値が1番目になるように最後の数値と隣り合う数値比較し順番に相違があれば入れ替えます。次に最後から2番目と3番目の数値を比較し順番に相違があれば入れ替えます。これを1番目の数値まで比較していきます。2番目に小さい数値が2番目になるように最後の数値と隣り合う数値を比較し順番に相違があれば入れ替えます。これらを繰り返していくことで小さい順になります。
プログラム例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
meta charset="UTF-8"> <script type="text/javascript"> var data = [5,4,3,2,1]; for(var i=0;i<data.length-1;i=i+1){ for(var j=data.length-1;j>i;j=j-1){ if(data[j]<data[j-1]){ var tmp = data[j]; data[j] = data[j-1]; data[j-1] = tmp; } } } </script> |
動作イメージ(ソートボタンを押してください)
ソート対象
購入時には価格が高い順に購入する必要があります。また、収入リストの表示は手数料の多い順に表示しなければいけません。いずれも価格が高い順(降順)の並び替えが必要です。
購入可能リストの形式が”物品名:価格”のため価格部分を抽出し並び替えを行います。並び変えの結果は、物品名と価格の配列をそれぞれ用意し格納するようにします。これは並び替え後に価格を用いて計算することを想定しているからです。また、収入リストの並び替えも同じ処理としたいため、収入リストを”物品名:手数料”の形式で作成することを前提とします。
プログラム&テスト結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<meta charset="UTF-8"> <script type="text/javascript"> var item = [ "江戸時代の小判が入っている陶磁器:290000", "マンモスの化石:2000", "明治時代の陶磁器:3000", "チンギス・ハンが愛用した硯:500000", "平成時代の陶磁器:1400", "鎌倉時代の古ぼけた絵画:24000", "デジタル式時計:1250", "安土桃山時代信長作の絵画:780000", "奈良時代の仏像の絵画:30000", "平安時代のきらびやかな陶磁器:14000", "平成時代の美咲さんが書いた絵画:10", "日時計:48000", "弥生時代の陶磁器:2000000", "江戸時代の歯車式時計:12000", "水時計:8800", "義経の刀:5000", "昭和時代の陶磁器:2400", "不発弾:-10000" ]; var sort_outName = []; //ソートアウトプット(物品名) var sort_outPrice = []; //ソートアウトプット(価格) //テスト sort(item); for(var i=0;i<sort_outName.length;i=i+1){ document.write(sort_outName[i]+":"+sort_outPrice[i]+"<BR>"); } /* ソート 処理:価格の高い順に並べる 引数:リスト("物品名:<価格>") 出力:sort_outName(名前),outprice(価格) */ function sort(target){ var outName = []; var outPrice = []; //物品名と価格を分割する for(var i=0;i<target.length;i=i+1){ var sep = target[i].indexOf(":"); outName[i] = target[i].substr(0,sep); outPrice[i] = target[i].substr(sep+1,target[i].length-sep); outPrice[i] = Number(outPrice[i]); } //バブルソート for(var j=0;j<outPrice.length-1;j=j+1){ for(var i=outPrice.length-1;i>j;i=i-1){ if(outPrice[i] > outPrice[i-1]){ var tmp = outPrice[i]; outPrice[i] = outPrice[i-1]; outPrice[i-1] = tmp; tmp = outName[i]; outName[i] = outName[i-1]; outName[i-1] = tmp; } } } sort_outName = outName; sort_outPrice = outPrice; } |