[過去ログ]
Perlについての質問箱 64箱目 (1002レス)
Perlについての質問箱 64箱目 http://mevius.5ch.net/test/read.cgi/tech/1548981877/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
833: デフォルトの名無しさん [sage] 2020/12/08(火) 23:53:37.62 ID:VS4VHEi1 すみません、ソートで教えて欲しいんですが下記のようにみたいな枝番号が付いてる文字列をハッシュのキーとして ハイフン前の数値でソートした後にハイフン後の数値でソートしたいのですが 普通に$a <=> $bだとハイフンの後の値がバラバラになって上手くいきません キーを作る際に別々に作ってループ増やすくらいしか自分には解決方法が無いのですが、スマートに出来る方法は無いのでしょうか? 1-1 1-2 2-1 2-2 3-1 http://mevius.5ch.net/test/read.cgi/tech/1548981877/833
834: デフォルトの名無しさん [sage] 2020/12/09(水) 00:31:36.73 ID:LWKBPFtb >>833 シュワルツ変換で検索! たとえば : mapでソート用の値として、前の数字×10000+後ろの数字の値をつくって、それともとの値のペアにする。 それを<=>でソートする。 mapで、ソート結果からもとのデータ部分を取り出す。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/834
837: デフォルトの名無しさん [sage] 2020/12/09(水) 09:35:02.27 ID:sn/SI4a+ >>833 こんな感じかな。デバッグはしていないが。 @newlist = sort compare @oldlist; sub compare{ my ($ap, $bp) = @_; ($ap1, $ap2) = $ap=~/([0-9]+)\-([0-9]+)/; ($bp1, $bp2) = $bp=~/([0-9]+)\-([0-9]+)/; return 1 if $ap1 > $bp1 return -1 if $ap1 < $bp1 # $ap1 == $bp1; return 1 if $ap2 > $bp2; return -1; } http://mevius.5ch.net/test/read.cgi/tech/1548981877/837
874: 532 [sage] 2020/12/12(土) 00:28:14.42 ID:tTwN9OuS >>833 perlのsort()アルゴリズムは5,8以降マージソートになってsort結果は安定なアルゴリズムなので 手短にコードを書くなら右の数字でsortしてから左の数字でsortすれば所望の結果が得られる。以下サンプル実装 use List::Util 'shuffle'; %h = map{$_ => $i++} shuffle qw{1-1 1-2 1-3 2-1 2-2 2-3 3-1 3-2 3-3}; use feature qw{say signatures}; no warnings experimental; @k1 = keys %h; say "@k1"; sub f($s) { [$s =~ /(\d+)/g, $s]}; @k2 = map{$$_[2]} sort{$a->[0] <=> $b->[0]} sort{$a->[1] <=> $b->[1]} map{f $_} @k1; say "@k2"; 実行結果 ~ $ perl 64_833_n-n_sort_1.pl 1-1 2-3 3-3 1-2 3-1 2-2 2-1 1-3 3-2 1-1 1-2 1-3 2-1 2-2 2-3 3-1 3-2 3-3 言語処理系内部のsort()関数のアルゴリズムに依存しない書き方がしたいなら 左と右の数値で二段階のソートをするか、右の数字と左の数値で順位に一貫性のあるキーを作って 一段階のソートで済ませる方法もあると思う。 そういったサンプル実装を見たいのであれば、時間があればくけれども… http://mevius.5ch.net/test/read.cgi/tech/1548981877/874
883: 532 [sage] 2020/12/12(土) 10:42:34.69 ID:+ekv//0b >>833 >>874に書いた左の数字と右の数値両方で順位に一貫性のあるキーを作って一回でsortするサンプル 数値は4桁以下であることを仮定してます。 use List::Util 'shuffle'; %h = map{$_ => $i++} shuffle qw{1-1 1-2 1-3 2-1 2-2 2-3 3-1 3-2 3-3}; @k1 = keys %h; print "@k1\n"; @kk = map{[sprintf("%4d%4d", /(\d+)/g), $_]} @k1; @k2 = map{$$_[1]} sort{$$a[0] cmp $$b[0]} @kk; print "@k2\n"; http://mevius.5ch.net/test/read.cgi/tech/1548981877/883
886: デフォルトの名無しさん [] 2020/12/16(水) 23:33:00.22 ID:qMOR0fCG >>833 もしそれが桁数固定で、例えばその例のように一桁の数、ハイフン、一桁の数という文字列ならば、何も考えずにそのまま文字列として比較して sort すればいい。つまりただ sort するだけ。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/886
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.031s