0

文字列が次の順序で終わるように、文字列の配列を並べ替えたいと思います。

@set = ('oneM', 'twoM', 'threeM', 'sixM', 'oneY', 'twoY', 'oldest');

お気づきかもしれませんが、これらは期間を表しているのでoneM、最初の月などです。私の問題は、期間で並べ替えたいのですが、文字列がそのままでは「並べ替え」を使用できないため、作成しました文字列の順序付け方法を表すこのハッシュ:

my %comparison = (
    oneM    => 1,
    twoM    => 2,
    threeM  => 3,
    sixM    => 6,
    oneY    => 12,
    twoY    => 24,
    oldest  => 25,
);

これにより、次のようなことができるようになり、生活が楽になると思っていました。

foreach my $s (@set) {
    foreach my $k (%comparison) {
        if ($s eq $k) {
            something something something

私はこれが物事を行うための長い道のりであると感じており、同等のものを見つけたら実際にどのようにソートするのか実際にはわかりませんでした...私は自分自身のプロットを少し見逃していると思いますそのため、どんな助けもいただければ幸いです

要求に応じて、期待される出力は、上記の @set に示されているようになります。@set の値はそのセットの一部になることを言及する必要がありましたが、必ずしもすべてが同じ順序であるとは限りません。

4

2 に答える 2

5

並べ替えが簡単なフォームを作成するために、データを事前計算する際に適切な戦略を選択しました。このデータは並べ替え自体の内部で計算できますが、値を比較する必要があるたびに再計算に時間を浪費することになりsortます。これは、プロセスを通じて複数回発生します。一方、キャッシュの欠点は、明らかに、キャッシュを格納するために追加のメモリが必要になることです。また、全体的な計算が少なくても、メモリが少ない状態ではソートが遅くなる可能性があります。

現在の設定では、並べ替えは次のように簡単です。

my @sorted = sort { $comparison{$a} <=> $comaprison{$b} } @set;

CPUを犠牲にしてメモリを節約したい場合は、次のようになります。

my @sorted = sort { calculate_integer_based_on_input{$a} <=> calculate_integer_based_on_input{$b} } @set;

その場で他の対応する値に変換するなどの個別のcalculate_integer_based_on_input関数を使用するか、入力をソートに適したものにインライン変換するだけです。oneY12

シュワルツ変換GuttmanRosler変換など、キャッシュ計算を使用した並べ替えの一般的なイディオムも確認することをお勧めします。

于 2012-09-12T11:07:58.873 に答える
5

入力と期待される結果の例を示すと役立ちます。これがあなたが探しているものだと思います:

my @data = ( ... ); 
my %comparison = (
    oneM   =>  1, twoM =>  2, threeM =>  3, 
    sixM   =>  6, oneY => 12, twoY   => 24,
    oldest => 25,
);

my @sorted = sort { $comparison{$a} <=> $comaprison{$b} } @data;

sortperlfunc マニュアルページの関数のドキュメントには、たくさんの例があります。("perldoc -f ソート")

于 2012-09-12T11:01:41.160 に答える