• ベストアンサー

配列の中身を行頭の数字で並べ替えたいです。VB.NET

Dim STR(100) As Stringの配列に STR(0) = "5 ABCDEFGHIJあいうえお" STR(1) = "2 ABCDEFGHIJあいうえお" STR(2) = "3 ABCDEFGHIJかきくけこ" STR(3) = "5 ABCDEFGHIJさしすせそ" STR(4) = "1 ABCDEFGHIJまみむめも" STR(5) = "11 ABCDEFGHIJたちつてと" ・ ・ ・ ・ このような内容が配列に入っているのですが、 各データの行頭の数字の大きい順に並べ替えたいです。 数字の後はしばらく同じ文字列が続きます。 数字の桁数は最大5桁です。 Array.Sort(STR) Array.Reverse(STR) を使うと9が最大で10がそれ以下の位置に置かれてしまいます。 このような並べ替えを行うには どんな流れで処理するのが一番分かりやすくて簡単でしょうか? ご回答頂けたら助かります。 よろしくお願い致します。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

>配列の中身を 配列のデータは、ソートに関しては、ディスクなどにあるデータと変わりません。ディスクファイルのソートもソートプログラムを自作するなら、配列に落とすでしょう。ですから配列云々は忘れてください。 ーー ソートはソートキー部について、レコード間で左からのバイト的位置関係が影響します。それを離れて 123abc 23hjk 1245bj .. のような数字部分だけを注目したいときは、左桁に進入している文字列部分が障害になるので、各レコードごと対応して、修正ソートキーを作らないといけません。 この質問ではとくに元が配列なので、修正ソートキーも配列にするでしょう。 数字文字部分と文字列部分をSplitする関数などVBには無いと思うので、自作するより他ないでしょう。 修正ソートキーつきファイルを既成ソートソフト(パソコンには付いてない)でソートするケースでなければ、自分で修正ソートキー配列を、元の配列と関連を保ったまま、ソートするプログラム(クイックソートアルゴリズムなどを使って)を組まないといけないと思います。 ただ、Array.Sortメソッドによる配列のソートhttp://www.atmarkit.co.jp/fdotnet/dotnettips/215arraysort/arraysort.html が使えるなら使うほうが簡単でしょう。 ーー 修正ソートキー配列を作らないで(使わないで)何か良い方法があるのでは、と考えるのは無駄でしょう。 ーー 言い忘れたが、修正ソートキー配列を別に作って、その配列をソートしても、元の配列は連れもってソートされるわけは無いから、修正ソートキー(5桁)を余分に先頭につけた、固定5桁数字+もとの配列のデータ、の配列をつくり、それをソートし、先頭の5桁をカットするということになると思う。

その他の回答 (1)

回答No.2

作成時点で簡単かどうかは わかりませんが、 後で見て やりたい事がわかりやすい(と思う)&一番スマートだと思うのは、 やはりSortメソッドの引数としてIComaparerを指定する方法でしょう。 私も少ししか齧ったことがないのですが、まずはimogasiさんが提示された リンクを熟読してください。 要は、2値の大小を決定する方法を自分で書いて、「この方法でソートしてね」と やるわけですが、その際に、各文字列の先頭の数字の文字列(Spaceより前の文字列)を 切り出してきてから数値に変換し、その大小で比べるようにしてやるわけです。 念のため、切り出しはInStr関数あたりでSpaceを見つけてから、そこまでの文字を Microsoft.VisualBasic.Left関数とかString.Substringメソッドあたりで行い、 数値に変換するのはCTypeとかCIntとかを使うのが手っ取り早いでしょう。 とりあえず時間が無いので、この辺で…(汗)