No.5
- 回答日時:
ややトリッキーになりますが、シュワルツ変換とハッシュを使った方法も回答しておきます。
print map { "x$$_{x}y$$_{y}z$$_{z}\n" }
sort { $$a{z} <=> $$b{z} or $$a{x} <=> $$b{x} or $$a{y} <=> $$b{y} }
map { { /([xyz])(\d+)/g } } @list;
解説:
/([xyz])(\d+)/g
これはxかyかzと、値の2項からなるリストを
(gオプションによって)可能な限り展開します。
/^(x)(\d+)(y)(\d+)(z)(\d+)$/
でも構いません。
それを内側のブレース(無名ハッシュコンストラクタ)で受け、
{ x => 1024, y => 2, z => 2 }
こういった無名ハッシュを作成します。
こんな展開を@list回だけで済ませるのがシュワルツ変換です。
No.4
- 回答日時:
http://www.din.or.jp/~ohzaki/perl.htm#SortMulti
[ 複数の項目でソートする ]
を参考にすると、こんな感じにもできます。
@list = qw(
x2048y2z3
x1024y2z5
x1024y4z2
x1024y4z3
x1024y2z2
) ;
print "x:y:z\n" . join( "\n",
map{ $_->[0] }
sort{ $a->[3] <=> $b->[3] or $a->[1] <=> b->[1] or $a->[2] <=> $b->[2] }
map{ [$_, split(/[xyz]/) ] }
@list
) . "\n";
まあ、無理に1行につっこむ必要もないのだけど、perlだから出来る技ですね。
[ 複数の項目でソートする ]
を参考にすると、こんな感じにもできます。
@list = qw(
x2048y2z3
x1024y2z5
x1024y4z2
x1024y4z3
x1024y2z2
) ;
print "x:y:z\n" . join( "\n",
map{ $_->[0] }
sort{ $a->[3] <=> $b->[3] or $a->[1] <=> b->[1] or $a->[2] <=> $b->[2] }
map{ [$_, split(/[xyz]/) ] }
@list
) . "\n";
まあ、無理に1行につっこむ必要もないのだけど、perlだから出来る技ですね。
No.3ベストアンサー
- 回答日時:
サブルーチンを持つsort関数を使うと複雑なソートも表現できます。
@newlist = sort{&compare($a,$b)} @list;
sub compare
{
my($v1,v2) = @_;
my($v1x,$v1y,$v1z) = split(/[x-z]/,$v1);
my($v2x,$v2y,$v2z) = split(/[x-z]/,$v2);
return $v1z <=> $v2z or $v1x <=> $v2x or $v1y <=> $v2y;
}
それぞれx,y,zの数字を分解して、z,x,yの順番に比較していきます。
この回答へのお礼
お礼日時:2005/12/18 22:49
sortの{}内にsubファンクションもいけるのですね。
この処理は多用するので、この記述はかなりうれしいです。
さっそくコピーして、モジュール化してしまおうと思ってます。
No.2
- 回答日時:
つまりこういうことかと
-----
my @list = qw(
x2048y2z3
x1024y2z5
x1024y4z2
x1024y4z3
x1024y2z2
) ;
@list = sort {
my @a = split(/[xyz]/, $a);
my @b = split(/[xyz]/, $b);
$a[3] <=> $b[3] ? $a[3] <=> $b[3]
: $a[1] <=> $b[1] ? $a[1] <=> $b[1]
: $a[2] <=> $b[2] ? $a[2] <=> $b[2]
: 0;
# 桁が解るなら
# $a[3]*100000000 + $a[1]*100 + $a[2] <=> $b[3]*100000000 + $b[1]*100 + $b[2];
} @list;
e @list;
No.1
- 回答日時:
算術比較演算子<=>は、同値のとき0を返し、Perlでは0はfalseなので、1つめの<=>で判定がつかない場合は、2つ目の<=>で大小を判定するよう、||でつないでいく形にすれば、ソートキーが複数の値からなる場合でも単一の式として表現できます。
これをシュワルツ変換にかければ、大抵ソートできます。
値の桁が事前に限定できるなら、単一の値を生成してキーにできます。こんな感じ:
$_ = 'x1024y2z2';
my @k = split( /[xyz]/, $_ );
[ $_, $k[3]*100000000 + $k[1]*100 + $k[2] ];
この回答へのお礼
お礼日時:2005/12/18 22:45
ありがとうございます。
値の桁数は限定できるので使えそうです。
複雑なsortの具体的な書き方が分からなかったので勉強になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2022/03/31 12:46
- 数学 線形代数の対称行列についての問題がわからないです。 2 2023/01/08 14:59
- 数学 数学直線の方程式とベクトル方程式について 直線の方程式で 点(x1,y1)を通り、直線ax+by+c 1 2022/08/12 12:13
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Excel(エクセル) EXCELの複数条件検索 1 2022/05/09 22:46
- 数学 固有ベクトルの縦書き 3 2022/12/19 23:48
- 数学 x1+3x2+2x3=4 2x1+x2-3x3=2 -5x1+5x2+18x3=a 次の連立1次方程 2 2023/07/02 03:15
- 数学 3次対称群S3はシロー部分群で因数分解できない この問題の証明が分かりません。できる範囲で教えていた 1 2022/12/13 13:10
- 経済学 国家公務員一般職試験の問題より 同じ財 X を生産する企業1、企業2からなる複占市場において、Xの需 2 2022/11/28 12:44
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
英語でのシャープとコメの呼び...
-
重複ファイルを削除したいので...
-
perlで配列名を動的に作り出したい
-
ハッシュのハッシュを実現したい。
-
列挙型と連想配列の違いを教え...
-
python の素朴な疑問
-
まったく同じファイルのハッシ...
-
連想配列のサイズ制限
-
ハッシュリストって単にハッシ...
-
ハッシュ検索はなぜ速い
-
データベースでユーザーのパス...
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
DoEventsが必要な理由について
-
エクセルの当番表を作っていま...
-
VBAで3秒だけ時間を止めたい
-
ループ内での条件処理
-
DOSコマンドのループ内のTIMEコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
列挙型と連想配列の違いを教え...
-
まったく同じファイルのハッシ...
-
ハッシュ値が一致したデータは...
-
英語でのシャープとコメの呼び...
-
ハッシュのハッシュを実現したい。
-
データベースでユーザーのパス...
-
UTF-8で書かれたJSPの日本語文...
-
Perlは戻り値で、ハッシュや配...
-
perlで配列名を動的に作り出したい
-
ハッシュリストって単にハッシ...
-
短いハッシュの作り方
-
重複ファイルを削除したいので...
-
*(アスタリスク)の意味
-
連想配列のサイズ制限
-
python の素朴な疑問
-
多次元配列から重複を削除
-
一意(ユニーク)かつ、ソート...
おすすめ情報