CGI-BBS > CGI > Perl > 配列をソートしたいのですが。


カレッヂ
カレッヂ


質問者 エス  投稿日 2004/7/15(木) 18:41:28
非常にヒントに近い質問がここにありましたが、ちょっとだけやりたいことが違いました。
ここを例に説明します。よろしくお願いします。

http://www.rescue.ne.jp/CGI-BBS/cgi/perl/20020314010255.shtml


それで、私がしたい事は、
上で使っていた hairetu.dat を

########## hairetu.dat ##########

200,3
300,4
100,7

などとし、配列[0]と[1]を掛け合わせた値でソートするにはどうしたら
良いのでしょうか?
------------
300,4,1200
100,7,700
200,3,600
------------
↑こんな風に出力したい。



よろしくお願いします。

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:
FTPソフト:
サーバ移転:していない
改造:(未選択) 改造前正常動作
CGI習熟度:middle

回答者 dental  [削除]  投稿日 2004/7/16(金) 00:03:58
#!/perl
@array = ( [ 200, 3 ],
	  [ 300, 4 ],
	  [ 100, 7],
	  [ 400, 8],
	  [ 1200, 5]
	);

@sort_array = sort { $b->[2] <=> $a->[2] }  
		map {
		  push (@{ $_ }, $_->[0] * $_->[1] ); $_;
		} @array;
			

### 確認  ###

foreach (@sort_array) { 
	 print join(',', @{ $_ });
	 print "\n";
}

__END__

他にも書き方はあると思いますが
とりあえず書いてみました。 効率的かどうかは考慮してません。

@array にデータを読み込んだものとします。

$a<=>$b で逆順です。
質問者 エス  [削除]  投稿日 2004/7/17(土) 15:28:45
> dentalさん

どうもありがとうございます。
まだまだ勉強不足で、「あ〜なるほど…」とはいきませんが、
これをヒントに、試してみたいと思います。
回答者 dental  [削除]  投稿日 2004/7/17(土) 23:02:27
2次配列を使わない場合、下記のような書き方もできます。

こちらのほうがわかりやすいでしょうか。
sort 関数が把握できれば他は問題ないと思います。

data.dat
---------
300,3
1200,2
650,2
---------

my @array = ();
open(F, "< data.dat") or die $!;

while (my $temp = <F>)
{
    chomp $temp;
	my ($one, $two) = split(/,/, $temp);
	push @array, "$temp," . ($one * $two); # 乗算値をカンマをつけて追加
}
close F;

# この時点での @array の値
#-----------
# 300,3,900
# 1200,2,2400
# 650,2,1300

@array = sort {  # 乗算値でソート
			( split(/,/, $b) )[2] <=> ( split(/,/, $a) )[2];
		 } @array; 

print join("\n", @array);
質問者 エス  [削除]  投稿日 2004/7/20(火) 21:49:07
> dental さん

これはボクにとっては分かりやすかったです。
こっちの方をヒントにCGIを作成してみて、
なんとか、目的を達成しています。
まだ、改良したいところはあるのですが。

基本というか、形が分かりました。
ありがとうございます。

返信(回答)する

 


Web裏技