読者です 読者をやめる 読者になる 読者になる

Java

待機中にリモートで自分のwebサービスを着々とコーディングしてるわけだが、
何だかんだでまたseasar2のserviceの記述が長くなってしまった件。
jsp側でURLエンコードしようとすると長くなりすぎるので、
java側でURLエンコードさせる必要があったので書いてみたのだが、
MarkingエンティティにgraphUrlという変数(メンバ)がないだけで、
これだけ無駄なコードを書く羽目に。

public List<MarkingDto> findAllOrderByScore() throws UnsupportedEncodingException {
    	List<Marking> list = select().innerJoin(song()).orderBy(desc(score())).getResultList();
    	List<MarkingDto> markingList = new ArrayList<MarkingDto>();
    	for (int i=0;i<list.size();i++){
    		MarkingDto markingDto = new MarkingDto();

    		StringBuilder str=new StringBuilder();
    		str.append("http://chart.apis.google.com/chart?cht=r&chxt=y,x&chls=4|4&chco=FF0000,00FF00&chxp=0,0,20,40,60,80,100");
    		str.append("&chd=t:");
    		str.append(list.get(i).song.avgPitch+","+list.get(i).song.avgStability+","+list.get(i).song.avgExpress+","
    				+list.get(i).song.avgVibrato+","+list.get(i).song.avgRhythm+","+list.get(i).song.avgPitch+"|"+list.get(i).chInterval+","
    				+list.get(i).chStability+","+list.get(i).chExpress+","+list.get(i).chVibrato+","+list.get(i).chRhythm+","+list.get(i).chInterval+"&chxl=1:");
    		str.append(URLEncoder.encode("|音程|安定性|表現力|ビブラート|リズム", "utf-8"));
    		str.append("&chm=s,FF0000,0,-1,12,0|s,FFFFFF,0,-1,8,0|o,00FF00,1,-1,12,0|o,FFFFFF,1,-1,8,0&chts=000000,13&chtt=");
    		str.append(URLEncoder.encode(list.get(i).song.artist+"/"+list.get(i).song.songTitle+"  ("+
    				list.get(i).song.requestNo4+"-"+list.get(i).song.requestNo2+")","utf-8"));
    		str.append("&chdl=");
    		str.append(URLEncoder.encode("全国平均|自分", "utf-8"));
    		str.append("&chs=350x260");
    		markingDto.graphUrl=new String(str);
    		//要素のコピー
    		markingDto.chExpress=list.get(i).chExpress;
    		markingDto.chInterval=list.get(i).chInterval;
    		markingDto.chRhythm=list.get(i).chRhythm;
    		markingDto.chStability=list.get(i).chStability;
    		markingDto.chVibrato=list.get(i).chVibrato;
    		markingDto.dateTime=list.get(i).dateTime;
    		markingDto.fall=list.get(i).fall;
    		markingDto.highPitch=list.get(i).highPitch;
    		markingDto.longTone=list.get(i).longTone;
    		markingDto.lowPitch=list.get(i).lowPitch;
    		markingDto.measure=list.get(i).measure;
    		markingDto.modulation=list.get(i).modulation;
    		markingDto.publicFlg=list.get(i).publicFlg;
    		markingDto.reportNo=list.get(i).reportNo;
    		markingDto.requestNo4=list.get(i).requestNo4;
    		markingDto.requestNo2=list.get(i).requestNo2;
    		markingDto.sob=list.get(i).sob;
    		markingDto.score=list.get(i).score;
    		markingDto.song=list.get(i).song;
    		markingDto.timing=list.get(i).timing;
    		markingDto.vibrato=list.get(i).vibrato;
    		markingDto.vibratoTime=list.get(i).vibratoTime;
    		markingDto.vibratoType=list.get(i).vibratoType;

    		markingList.add(markingDto);
       	}
        return markingList;
}

MarkingDtoはMarkingをExtendsさせたけどもっとマシな要素コピーの方法ないものか。

Java

seasar2フレームワークが3ケ月ぐらいブランクあってjspとかもなかなか思い出せなかった。
次の会社ではたぶん別のフレームワークだけどコーディングの勘ぐらいは取り戻しておきたい。
本日のネタはナップザック問題。動的計画法で解けるアレです。
他言語のソースをjavaに直して何とかしたものですw

public class knapsack {
	public static void main(String[] args) {
		int capacity = 143;
		int[]price={
				10788,10721,10513,10236,9478,
				9478,9111,8831,8831,7693,
				7535,7181,7068,6918,6874,
				6859,6737,6591,6496,6212,
				6017,5912,5786,5708,5574,
				5513,5144,5110,4954,4827,
				4560,4559,4466,4428,4081,
				3886,3247,3217,3064,3016,
				2898,2826,2780,2642,2580,
				2485,2245,2203,1742,2063,
				2058,2013,1996

			};
		int[]weight={
				11,9,12,9,14,
				14,8,9,14,12,
				10,8,13,11,8,
				12,9,12,12,11,
				12,11,11,9,5,
				5,11,6,10,7,
				7,8,8,11,8,
				8,9,9,5,6,
				8,6,11,6,13,
				13,11,12,11,8,
				11,12,11
				};
		System.out.println(computeKnapsack(capacity,price,weight));
	}

	public static int computeKnapsack(int capacity, int[] price, int[] weight) {
		int numItem = price.length;
		int[][] dp = new int[numItem + 1][capacity + 1];
		int[][] g = new int[numItem + 1][capacity + 1];
		for (int c=0;c<=capacity;c++){
			dp[0][c]=0;
			g[0][c]=1;
		}
		for(int i=1;i<=numItem;i++){dp[i][0]=0;}
		for (int c = 1; c <= capacity; c++) {
			dp[1][c] = c < weight[0] ? 0 : price[0];
//			g[0][c]=0;
		}
		for (int i = 2; i <= numItem; i++) {
			for (int c = 1; c <= capacity; c++) {
				if (c < weight[i - 1]) {
					dp[i][c] = dp[i - 1][c];
					g[i][c] = 0;
				} else {
					dp[i][c] = Math.max(dp[i - 1][c], dp[i - 1][c - weight[i - 1]]
							+ price[i - 1]);
					g[i][c] = 0;
					if (dp[i][c]==dp[i - 1][c - weight[i - 1]]
					                        + price[i - 1]){
							g[i][c]=1;
						}
				}
			}
		}
		for(int i=1;i<numItem+1;i++){
			for(int j=1;j<capacity+1;j++){
//				System.out.println("d["+i+"]["+j+"]="+dp[i][j]);
				if(j<=capacity+1){
					System.out.printf("|%5d(%1d,%2d)",dp[i][j],g[i][j],i);
				}
				if(j==capacity){System.out.println("");}
			}
		}

		int c=capacity;
		for (int i=numItem;i>0;i--){
			if(g[i][c]==1){
				System.out.print(price[i-1]+" ");
				c=c-weight[i-1];
			}
		}
		return dp[numItem][capacity];
	}
}

用途?GF(仮)のセンバツ編成を考えるためw
最後に何を選択したかの表示にまだ少しバグがあるけども。
さすがにDB使うまでのものでもないかなぁ....。
これも2,3ケ月前に作った(翻訳した)ものなのでアルゴリズムが思い出せないw