• ベストアンサー

重複を無くしてのソートの定石は?

sortで、 $lines[0] = "02"; $lines[1] = "02"; $lines[2] = "01"; $lines[3] = "03"; で、 01 02 03 と重複を無くしてソートしたいときに、 sort { $a cmp $b } @lines の{}部分を変更してこれを実現する「定石」なる方法はあるでしょうか?sortを使わない定石方法でもいいです。

  • arcsin
  • お礼率46% (194/417)
  • Perl
  • 回答数1
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

sort関数では重複要素を取り除くことは出来ません。 重複要素の取り除きには、参考URLの方法を利用しましょう(私が考案したものではないので、ここにはかけません)。 http://www.din.or.jp/~ohzaki/perl.htm#ArrayUnique さらにソートもしたい場合、上記の方法で重複要素を取り除いた後でsort関数を使うといいと思います。

参考URL:
http://www.din.or.jp/~ohzaki/perl.htm#ArrayUnique
arcsin
質問者

お礼

ありがとうございます。大変参考になりました

関連するQ&A

  • csv元データーの数字の列が、""で囲まれているせいか、数値としてのソートできません

    次の式でソートしたいのですが、 @LINES = sort { (split(/\,/,$a))[0] <=> (split(/\,/,$b))[0] } @LINES; csv元データーの数字の列が、 "28000000","鈴木", のように""で囲まれているせいか、<=>で数値としてのソートできません。 cmpで文字列としてのソートは出来ます。 どうしたら良いのでしょうか?

    • ベストアンサー
    • Perl
  • Perlの文字列ソートについて

    こんにちわ。 例えば、 あいう,2002/04/12, ななな,2002/04/14, あいう,2002/04/20, というlogがあったとして、これを表示させるときには、 あいう 2002/04/12 あいう 2002/04/20 ななな 2002/04/14 といった具合に出力させたいのですが、そのsortのさせ方がわかりません。 my @lines = sort by_no(@lines); sub by_no { my $no1 = (split(/,/,$a))[0]; my $no2 = (split(/,/,$b))[0]; $no2 cmp $no1; } ではどこがいけないのでしょうか? 教えてください。お願いします。

    • 締切済み
    • CGI
  • grepとsort

    my $files = readdir(DIR); @files = grep { !/^\.\.?$/; } @files; 「.」と「..」の除去 @files = sort { $a cmp $b; } @files; ファイル名のソート この2文についてですが、grepとsortに関する文法がよくわかりません。 grepって、除去するコマンドなんでしょうか? sortでは、$a cmp $bが何を意味しているのでしょうか。

    • ベストアンサー
    • Perl
  • ソートの方法

    某CGIを改造中です。 記事を更新日順でソートしなおしたいです。 多分、ソート部分だと思われる部分の現状は、 ----- foreach (@data) {   ($no,$year1,$month1,$day1,$name~~) = split(/<>/);   @tmp = ();   @tmp = map {(split /<>/)[0]} @data;   @data = @data[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp]; } ----- です。 ただ、見ての通り、日付が「$year1,$month1,$day1」と分かれています。これを結合して(20060309のような形)、それを元にソートしなおしたいのですが、どのようにしたら良いでしょうか? 方法を教えてください。お願いします。

    • ベストアンサー
    • Perl
  • データの日付でソートをしたい

    データの日付でソートをしたい データの日付でソートをしたいと思ってますが、うまくいっていません。 $kuchikm2の内容 1,8,,説明文,2010/07/06-01:27,1,,,,,,, 2,8,,紹介文,2010/07/18-02:27,1,,,,,,, 3,8,,コメント,2010/05/19-03:27,1,,,,,,, 4,8,,文言,2010/06/20-04:27,1,,,,,,, ソートした結果@sorted 2,8,,紹介文,2010/07/18-02:27,1,,,,,,, 1,8,,説明文,2010/07/06-01:27,1,,,,,,, 4,8,,文言,2010/06/20-04:27,1,,,,,,, 3,8,,コメント,2010/05/19-03:27,1,,,,,,, (perlソース) 略 #sortロジック use warnings; my @lines = $kuchikm2; print @lines, " a\n"; my @sorted = map { $_->[4] } sort { $a->[0] <=> $b->[0]} map { [(split q{,}, $_)[4], $_] } @lines; print @sorted, " b\n"; (ここまで) 以前ソートで質問したときに、数字でないといけないと言われたような気がしています。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perlで大容量CSVのsort方法について

    perlで大容量CSVのsort方法について perlでcsvファイル100MB超のファイルをソートしたいと思ってますが、以下の方法でメモリーの関係上(と思ってます。)できません。 ソートを行う方法がありますでしょうか? 件数も11万件あるので、エクセルでソートしてからの受け渡しが出来ずに悩んでます。 (ここから) #sortロジック sub sort { use warnings; use feature ':5.10'; open my $ifh, '<', $inport or &error("Can't open $inport"); my @lines = <$ifh>; close $ifh; print @lines, "\n"; #csvファイル何番目? my @sorted = map { $_->[0] } sort { $b->[0] <=> $a->[0]} map { [(split q{,}, $_)[0], $_] } @lines; @lines = @sorted; exit; } (ここまで) いつも貴重なアドバイスをありがとうございます。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 配列の日付ソート処理2

    先ほど下記のような質問をしたのですが、、、 最初の配列の添え字を取得したい場合はどのようにしたらいいのでしょうか?? ksort($up_date, "cmp"); while (list ($key, $value) = each ($up_date)) { echo "$key: $value\n"; } function cmp ($a, $b) { if ($a == $b) return 0; return ($a > $b) ? -1 : 1; } としても、日付がうまく昇順されません。 この方法では駄目なのでしょうか?? ******************************************* 配列に下記のような日付が入ってます。 $array[0]=2004-11-01 14:20:10.412761+09; $array[1]=2004-11-28 19:09:42.898169+09; $array[2]=2004-11-26 17:16:10.531744+09; $array[3]=2004-11-30 20:25:39.622259+09; これをもっとも新しい日付の順序にしたいのですが、 これはやはり、バブルソートなどを作成する必要がでてきますでしょうか??? *********************************************

    • ベストアンサー
    • PHP
  • 重複の数によって塗潰しの色を変える方法

    このカテゴリーのエクセルの達人の方々に質問です。 どなたか回答して頂ける方がおみえでしたらよろしくお願いします。 (ちゃんとした回答ではなく、文句やクレーム等を混ぜた記載はご遠慮ください。  私の質問が気に入らない場合は無視して頂ければ結構です。) 【質問】 添付図のとおり、A列とB列に数字が入っていて重複がありますが 昇順で並んでいます。それが100行あります。重複の数に応じて以下のとおりセルの塗潰しがしたいです。  A列&B列重複 ・・・2個なら”黄色”で塗潰し。  A列&B列重複 ・・・3個なら”青色”で塗潰し。  A列&B列重複 ・・・ 4個なら”緑色”で塗潰し。  A列&B列重複 ・・・ 5個なら”赤色”で塗潰し。 上記を実現する方法をVBAで実現する方法が知りたいです。   【注意事項】   ・A列、B列の数字は毎回異なります。   ・VBAで実現する方法~、と書きましたが、    同様のことが他の方法でも実現できればそれを教えて下さい。   ・使用するエクセルは2021です。 以上、よろしくお願いします。

  • ソートのテクニックについて

    お世話になります。 ソートのテクニックについて教えていただきたく質問しています。 ソートをするに、パタンが二つあると思います。 例示パタン1; 一人が5回の試技を行い、結果を記録したレコードがあり、 5回の試技を昇順に列べてからリストする。 レコード形式;名前、試技1、試技2、、、試技5、試技平均 例示パタン2; 一人が砲丸投げとやり投げを行い、結果を記録したレコードがあり、 砲丸投げと、やり投げ毎に記録の良い順にリストする。 レコード形式;名前、砲丸投げ記録、やり投げ記録 上記パタン1では、データを頭から読み出しながら試技をソートすれば良く、 ソートに要するスペース(メモリ?)は少なくて済む。 パタン2では、予め全レコードについてソートしてからリストする必要があるため、 スペースが要求されると思います。 ここで質問です。 パタン2のような場合、どのようなテクニックを使えばよいのでしょうか。 実際に動かしているのですが、パソコンでは問題なくても携帯電話で動かすと、 ”上限サイズを超えたので云々”とのエラーになります。 (シュワルツ変換というテクニックでソートしています。)   @lines = map {$_->[0]}      sort {$b->[11] <=> $a->[11] or $a->[1] <=> $b->[1]}      map {[$_, split /<>/]} @lines; 上記の場合、メモリに蓄えられてソートがされると思います。 一度外に書き出すようなテクニックの方が良いのでしょうか。 時間も掛からず、メモリも食わない方法が理想ですが、 そうも行かないと思います。 メモリを食わずに済む方法を教えてください。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • こんなソートがしたいです。教えてください!

    エクセル2003で 下記のようなデータをソートし、 【ソート前】 2208550 92059184 92059174 92059174B 92059174A 92059174C 1348535 19777225 2519034 2519034D 2519034B 2519035A 2519035C 【ソート後】 1348535 19777225 2208550 2519034 2519034B 2519034D 2519035A 2519035C 92059184 92059174 92059174A 92059174B 92059174C 上記ソート後の結果を得られるマクロを作りたいです。 よろしくお願いいたします。