• 締切済み

ソートの順番を変える処理

現在、C言語の勉強をしています。 そこで、ソートについて皆さんのお知恵を拝借させてください。 文字コードで大小を比較してソートを行うにあたり、文字コードの大小とは違う方法でソートしたい場合はどのように行えば良いでしょうか? 例えばASCIIコードで 「*」は42(0x2a)、 「#」は35(0x23)、 数字の「0」は48(0x30)なので、 1:*111 2:#222 3:333 というデータがあった場合、文字コード順だと 1:#222 2:*111 3:333 という順になってしまいます。 それを 1:*111 2:#222 3:333 という順にソートするにはどうしたら良いのでしょうか? 実装方法が全く分からず、同じような質問が無いか探してみたんですが、見当たらなくて困っています・・・。 有識者の方、どうかよろしくお願いいたします。 また、以上のデータはASCIIですが、他にもSJISの文字(ひらがなや全角英数)を使用するデータのソートも同様の処理を行いたいと思っております。もし可能でしたら、少しだけでもアドバイスをお願いいたします。

  • ya-cha
  • お礼率68% (184/268)

みんなの回答

  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

文字コードを直接比較するのではなく、 優先順位順に文字を並べたコード表のテーブルを用意し、文字がそのテーブルの何番目なのかを比較対象にする。 但し、極論として比較対照すべての文字数分のテーブルが必要になる。 てっとり早く書くと、簡単にはできない。

ya-cha
質問者

お礼

ご回答ありがとうございます。 やはりそう簡単ではないのですか・・・

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ソート順を決める配列などを準備してデータを検査して値を決定します int nIndex[3]; char data[3][] = { "#222", "333", "*111" }; for ( int n = 0; n < 3; n++ ) {   if ( data[n][0] == "*" ) {     nIndex[n] = 1;   } else if ( data[n][0] == '#" ) {     nIndex[n] = 2;   } else {     nIndex[n] = 255;   } } といった具合にして nIndexをキーにしてソートすれば良いでしょう

ya-cha
質問者

補足

ご回答ありがとうございます。 この場合だと、 データが 1:0*1 2:0#2 のような場合でも大丈夫ですか??? ソースを読み解く力もあまり無いのでよく分かりませんが・・・・。 説明不足でしたが、文字列の先頭にソート対象の文字があるというわけではありません・・・。 やはり難しいでしょうか?

関連するQ&A

  • VB6 任意の順番でのソート

    現在VB6の勉強をしております。 Public Type udtMenberData name As String '名前 kana As String '読み仮名 tel As String '電話番号 End Type Public udtArrayMember() As udtMenberData 'データ保持用配列 上記のような配列に、ファイルから読み込んだデータが格納されております。 これを、電話番号でソートしたいのですが、文字コード順ではなく、 「'*' < '#' < '0' < ... < '9' 」 という順番でソートしたいのです。(上記以外の文字は入力されないです。) クイックソートで実現させたいのですが、方法が分かりません・・・。 ヒントや実装方法だけでも教えていただけませんでしょうか? 以上、よろしくお願いいたします。

  • フォルダ内のソート順について

    フォルダのソート順で名前順にした時、WIN2000では全角半角英字の区別なく表示されますが、XPでは半角→全角の順でまずソートを行ってしまう為、困っております。何か解決の方法はあるのでしょうか?

  • Comparatorを使用したソートについて

    Javaのバージョンは1.5です。 Comparatorを使用してソートを行っています。 ソートをシフトJISコード順とするため 下記のようなクラス、メソッドを作成しています。 public class ExmComparator implements Comparator<Object> { public int compare(Object obj1, Object obj2) { byte[] b1 = obj1.toString().getBytes("SJIS"); byte[] b2 = obj2.toString().getBytes("SJIS"); int len; if (b1.length < b2.length) { len = b1.length; } else { len = b2.length; } int s1h, s2h; for (int i = 0; i < len; i++) { s1h = b1[i]; s2h = b2[i]; if (!(s1h == s2h)) { return s1h - s2h; } } return b1.length - b2.length; } } ソートするキー(名称+コード)が "-0001","テレビ0002","電話0003","PC0004"の場合はシフトJISコードの昇順に "-0001","PC0004","テレビ0002","電話0003"としたいのですが、 "テレビ0002","電話0003","-0001","PC0004"とソートされてしまいます。 半角ハイフンは名称がない場合の代替名称です。 シフトJISコードは - :0x002d P :0x0050 テ:0x30c6 電:0x9364 なのでこの通りにソートされるのではないかと思ったのですが、 2バイト文字はどうなんでしょうか…。

    • ベストアンサー
    • Java
  • ちょっと特殊なソート

    ソートプログラムを作りたいんですが、ちょっと特殊なんです。 入力データとして 5 2 4 8 1 4 みたいに、スペースで区切られた数字および文字列があります。それをスペースまでを一区切りとしてソートしていきたいのです。上の例だとこんな感じ。 2 4 5 1 4 8 どういう風に設計するのがいいと思いますか? シェルスクリプトに埋め込みたいので、できるだけコードを短くしたいのですが… 教えてください。

    • ベストアンサー
    • Perl
  • ファイルメーカーのソート順位

    FileMakerPro V10において、data(レコード)を下記のように並べ替えたいのですが、記号(?)を使っているせいか、希望のように並んでくれません。フィールドのdata記入方法を変えないとダメなのでしょうか?。フイールドtypeはテキストで、dataは単純に「?在庫」(=全角文字)と入力しているだけです。 (レコード内容) 在庫フィールド、   在庫品フィールド、 ?在庫           品番1 在庫          品番1 在庫          品番2 在庫          品番3 ?在庫         品番2 在庫?         品番1 ↓のように並べ替えたい ?在庫          品番1 ?在庫                   品番2 在庫          品番1 在庫          品番2 在庫          品番3 在庫?         品番1 FileMakerProのマニュアルを読んでも “テキストデータではひらがなとカタカナは名前順、漢字はコード順、英単語はアルファベット順、数値は小さいものから順に、日付や時刻は古いものから順にに並びます。” となっているのですが‥‥。

  • Perl UTF8 での氏名チェック

    ■環境 Linux, Perl 5.8 です。 画面(HTML)と処理(Perl)は分けて作成しており、Templateモジュールで画面表示を行っています。 HTMLもPerlも文字コードはUTF-8です。 ■質問 フォームからうけとった文字列で以下の文字以外をエラーとする入力チェック処理(正規表現)をUTF8用に作りたいです。 ・漢字 ・ひらがな ・全角記号(ー-のみ) ・全角スペース ・全角カタカナ(http://okwave.jp/qa4997637.html) 直前の全角カタカナチェック(http://okwave.jp/qa4997637.html)と類似しているのですが、別に質問させていただきました。 色々探してみたのですが、UTF8でそのようなチェックモジュールが見つからず、 正規表現で書くしかないのかと思い、正規表現でも書いてみましたがうまくいきませんでした。 チェックモジュールが存在するのであれば教えて頂きたいです。 または、以下のようなシンプルな書き方(以下はUTF8ではなくSJISの全角カタカナチェックですが)があればご教授頂きたいです。 また、文字コードの対応(例えば\x40が何の文字にあたるか)がUTF8で分かれば応用がきくのですが、 それも見つからなかったので、対応表、調べ方をご存知の方がいらっしゃったらご教授頂きたいです。 ・SJISの全角カタカナチェック if($data !~ /^(?:\x83[\x40-\x96])+$/){ $mes="全角カナ以外がありますよ"; } よろしくお願い致します。

  • エクセルのソート順がおかしい

    エクセルのソート順がおかしい B4セルから縦方向に以下のデータを降順にオプションでコード順にソートする。 磐田 川崎 G大阪 C大阪 の順になる。 各要素間の値の比較する関数をVBAで作成して比較すると 川崎 < G大阪 となり、大小関係がおかしくなる。 上記以外の比較は下記のとおり正しい。 磐田 > 川崎 G大阪 > C大阪 各要素間の値の比較する関数は以下である。 Option Explicit Function compare(str1 As String, str2 As String) As String ' 大小関係を検査する If str1 > str2 Then compare = str1 & " greater than " & str2 ElseIf str1 = str2 Then compare = str1 & " Equal to " & str2 Else compare = str1 & " smaller than " & str2 End If End Function 実際のプログラムは「2分木探索」を使用しているので,大小関係が大切である。 これはどうすればソートがコード(ユニコード)順になるのか、教えて下さい。 なおエクセルは2000を使用している。

  • VB6での文字コードダンプ

    VB6を使用して文字のダンプを取得したいのですが、UNICODE→SJIS変換しての バイト長を取得するものはよく見かけるのですが、全角文字の文字コードの取得法は、調べてはいるのですがなかなか見つかりません。 行いたいことは、全角の"あ"の場合、0x82、0xa0のように SJISでの1バイト毎の16進(10進でも可)の文字コードを 取得したいということです。 よろしくお願いします。

  • windows2000で数字の順番にソートしたい

    会社に複数台のPCがあり、windowsの2000・XP・Vistaの3種類のOSがあります。 今、2000のPCで仕事をしているのですが、エクスプローラでファイルを並べるときに、名前順にソートすると、10→11→1→20→2・・・のようになって大変不便です。 XPやVistaでは、ちゃんと1→2→10・・・のように並びますよね。 会社のデータなので勝手に名前を付け替えるわけにもいきません(頭に0もつけられません)。 2000でXP・Vistaタイプのソートをする方法はありませんか? よろしくお願いします。

  • ArrayListなどのソート

     いつもお世話になっています。ArrayListなどをソートする際に、Comparatorインターフェースを実装したクラスを利用して、辞書順や数値順などでソートすることは出来ますよね。これを任意の単語の順番にソートするにはどのようにすればよいのでしょうか。つまり、下記例において、文字列順ではなくて、"ONE", "TWO", "THREE", "FOUR"の順番にソートしたいのです。 ArrayList list = new ArrayList(); list.add("THREE"); list.add("ONE"); list.add("FOR"); list.add("TWO");  やはりcompare()メソッド内で総当り的に比較するしかないのでしょうか。  開発環境はJDK1.4です。事情により返答が遅れてしまうかもしれませんが、どうぞ宜しくお願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう