• ベストアンサー

qsortの関数

qsortで昇順や降順にする用に関数を書き換えたり出来ますが・・ linuxで言う[sort -u [ファイル名]]のように 同じ文字列を見つけたときに 同じ行を削除するにはどうしたらよいのでしょうか? たとえば qwer asdf zxcv tyui ghjk vbnm asdf zxcv とファイルがあったとすれば ソート後 重なっている asdf zxcv を一行にまとめて表示したいのです。 linuxコマンドで言うまさに sort -u です。この場合「-u」が普通のソートと違うところだと思っています。 qsortで指定する関数を書けばいいのでしょうか? 詳しくお願いします。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

qsort ではデータの個数は変化しないので, ソートしたあとで「前のデータと比較して, 違う場合に限って出力する」ことになるかと. ソートしたあとの処理を簡単に書くと char **p, **q; p = q = data; printf("%s\n", *p++); while (p < data + n) { if (strcmp(p, q)) { printf("%s\n", *p); } ++p; ++q; } って感じ.

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • amru05
  • ベストアンサー率63% (33/52)
回答No.2

 C++ならばstlのsetを使用すると簡単に出来ます。  set:集合コンテナ。同じ物は1つしか入らない便利    データ保存用の入れ物??? <使い方> 1)文字列をset<string>のコンテナに全てinsertする 2)set<string>のコンテナから順にデータを取り出せばユニークな文字列になります。 <ソース例:書いただけで動かしていないので??> std::set<string> sdat ; sdat.insert(string("qwer") ; sdat.insert(string("asdf") ; sdat.insert(string("zxcv") ; sdat.insert(string("tyui") ; sdat.insert(string("ghjk") ; sdat.insert(string("vbnm") ; sdat.insert(string("asdf") ; sdat.insert(string("zxcv") ; std::set<string>::iteroter sit ; for (sit=sdat.begin();sit!=sdat.end();sit++) { cout << *sit << endl ; } とすると文字列が重なっていても、一度しか出てきません。 (PS)  以前なら、sort関数を自分で作成して、その後、出力する時に以前の文字と同じかチェックして同じなら、出力しないようにする。。。関数を作成していましたが、毎回同じような事をするのは意味が無いので、c++のstlを使用しています。  set/mapなどの使い方だけでも覚えると本当に便利ですよ。

参考URL:
http://www.geocities.jp/ky_webid/cpp/library/009.html
全文を見る
すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

qsortは並び替えをするだけですから、所望の動作をするには 配列を並び替える→ 配列を順に出力(このとき同じデータが連続していたら 最初のものだけ出力)のようにする必要があります。 sort hoge.xt | uniq のようなものです。sort -u は昔はありませんでした。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リストボックス操作

    vb6を使ってます。 リストボックスへ読み込んだテキストファイルに行番号を振る最も効率的な方法を教えていただけませんか? ※イメージ ------------------------------ asdf zxcv qwer poiu ouyt ・ ・ ・ ------------------------------ ↓読み込んだテキストデータをこのような形にしたいです。 ------------------------------ 01_asdf 02_zxcv 03_qwer 04_poiu 05_ouyt ・ ・ ・ ------------------------------

  • 文字列3次元配列のソート(複数キー)について教えてください

    皆様こんにちは。 ソートについて悩んでおります。 以下の様な表イメージで配列を持っており (実際は要素数は動的に変わります) char AAA[10000][20][10]; /*(10000行20列10文字)*/ これを列毎のキーで昇順/降順と並び替えるプログラムを Cにて実現させたいのですが 検索して調べても2次元はよく載っているのでが、 複数列となるとなかなか無くて、お手上げ状態です。 ・qsortは使えない。 ・安定するソート法にてやらないといけなさそう というのはなんとなく理解できるのですが..... 良い方法をご存知の方いらっしゃいましたら、よろしくお願います。

  • sortコマンドについて

    Unixのソートコマンドを用いて複数ソートキーを指定し、 ソートキーに応じて昇順降順を指定することはできるでしょうか? 宜しくお願い致します。 第一ソートキー 昇順 第二ソートキー 降順 第三ソートキー 昇順 以下を試して見ましたがうまくいきませんでした。 sort -k 1.1,1.2 -r -k 1.4,1.6 -k 1.8,1.9 test.txt

  • VBでのFlexGridのソート方法

    VBでのFlexGridのソート方法でいくつかの列を指定して その列がKeyとして昇順または降順のようなソートは 可能でしょうか?

  • Sortコマンド以外で行をソートする方法

    Sortコマンドを使ってテキストファイル内の行をソートしていたのですが、扱うテキストファイルの内容によってエラーが出てしまい、エラーメッセージをWEBで検索して書かれていた対策をしたのですがうまく行きませんでした。 ですので、Sort以外のコマンドで、テキストファイル内の行を昇順と降順でソートしたいと考えているのですが、何か方法はないでしょうか。 Windowsのコマンドプロンプトで使用出来るものであれば、AWKでもPerlでもその他のコマンドでも構いませんし、スクリプトファイルを読み込めるコマンドでしたらスクリプトでの書き方でも結構ですので、ご存知の方がおられましたら教えて頂けないでしょうか。

  • Excel昇順関数について

    データの昇順・降順方法として、メニューから「データ」→「並べ替え」とする方法がありますが、関数で同じことを実現できるものはあるのでしょうか?(例)A列に上から、「5、3、1、4、2」と並んでいるときに、(関数を入力した)B列上から「1、2、3、4、5」と表示する。

  • excel:一番上の行がソートできない

    winxp pro sp2, office2003, Q: A列で昇順ソートすると、下記の様に、一番上の行がソートできません。但し、A列で降順ソートすると、きれいにソートできます。 対策を教えてください。お願いします。 A   B 4  武井工業 1  鉄人化計画 2  メディアS 3  SBIフューチャーズ

  • 構造体のソートの記述について

     C言語で自己参照構造体(beforeとnextで繋げてます)で名簿をつくり、年齢で昇順ソートをしようと考えています。  そこで、ソート関数の「qsort」というものを使ってソートしたいのですが、どのように使ったらいいのでしょうか?  参考例などがありましたら、教えていただけますか?  よろしくお願いします。

  • Linuxの並び替えで特定の行を一番最後の行に配置

    Linux において sort などを使ったテキストファイルの中身の並び替えにおいて 特定の(なるべく複数の)行、ここでは仮に target line 1 target line 2 という内容の行だとします(ご覧の通り空白が入っています)。 これを一番最後の行に配置されるようにしたい、などということは可能でしょうか? また、 sort -u と組み合わせるには sort -u input.txt | sort > output.txt の後半部分をこのケースのコマンドに書き換えるだけで問題ないでしょうか? どうぞよろしくお願いいたします。

  • excel VBA の条件をつけての列ごと並び替える方法がわかりません。

    excel VBA を最近学び始めたのですが、 ソートで、 4 8 3 1 7 8 8 2 8 9 6 2 5 1      ↓ 1 3 4 7 8 8 8 6 9 2 2 8 5 1      ↓ 1 3 4 7 8 8 8 6 9 2 2 1 5 8 と並び替えるソートのVBAがわかりません。一回目のソートで1行目を基準に列ごと昇順?に並び替え、二回目のソートで1行目の昇順を満たしながら二行目の数字を基準に列ごと昇順にソートしたいのです。 検索をかけて、バブルソートのVBAなどを見てみましたが、難しくて理解できません。(この前こそ、「かんたんプログラミング EXCEL VBA」を読んだ知識レベルです。) 昨日の18時からがんばっているのですが、一向にわからないです。。 お時間ありましたら、どなたか教えていただけないでしょうか?