文字列の並び替え への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 るしぇ  (社会人) 投稿日時 2009/8/28 19:44:11
並び替えの仕組み自体はいたるところに利用されていますからね。
既存の仕組みを利用して良いなら、使った方が早いしバグも少なく
なります。

VB で既存の機能を利用した場合、ほとんどがクイックソートです。
質問文のコードはバブルソートですね。人間が一番最初に思いつく
並べ替えの手順だと思います。

並び替えの勉強してるならソートのアルゴリズム自体も変更できる
といいですね。
[いろいろなソートアルゴリズム]
http://www.ibe.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/

VB.NET の既存クラスではソートのアルゴリズム自体はクイックソート。2値の大小
判定だけ別に定義できるような仕組みが考えられています。
[第25回 実技2 フォルダ情報一覧]
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard25.htm
IComparer インターフェースです。
ここに大小関係を判定するルールを書けば色々な既存クラスに利用できます。
アタッチメントを交換すれば電動ドリルにもねじ回しにもなるといった
発想です。この辺もクラスを物として捉えていると、現実世界のアイデア
と結び付けやすく、オブジェクト指向が有効な面だと思います。
投稿者 mitchin  (社会人) 投稿日時 2009/8/28 09:23:53
自分ならこうするということで、

・List(Of Integer) と List(Of String) を用意
・TextBox の値が数値なら List(Of Integer) にその数値を格納、数値以外なら List(Of String) に格納
・2つの List を Sort
・List(Of Integer) をループで回して TextBox にセット
・List(Of String) をループで回して TextBox にセット

1つの案として検討してみてください。
投稿者 るしぇ  (社会人) 投稿日時 2009/8/28 03:19:39
> 数値の頭に0をいれて桁数を合わせて文字列としてから
> 比較する方法もあります。
発想としてはありです。ただし当然、最大桁数が必要になりますよね。
まぁ、一度全ての文字列を検索して一番長い文字列を探すということ
で解決とかも考えられます。

発想はたくさんあったほうがいいので、ボクも1つ無理やり案を。。。
一度文字列としてきれいじゃないソートを実行してしまいます。
その後、先頭から数字の部分だけ数字のソートで入替えます。

…とか思ったところで
Textbox1.text = 12A00
Textbox2.text = 12A1
Textbox3.text = 12B45
Textbox4.text = 12
TextBox5.text = 100
みたいに数値始まりの文字列が混ざった場合ってどう並ぶのが正解なの?とか。

数値に変換できる文字に気をつけてねーとか。
http://jehupc.exblog.jp/8323019/

波紋だけ広げて逃げますw
投稿者 流れ者  (社会人) 投稿日時 2009/8/28 02:56:58
こんばんは。

もう一つの方法としては、
数値の頭に0をいれて桁数を合わせて文字列としてから
比較する方法もあります。

例のなかでは、"111"を"0111"に一時的に変換してから
比較します。
投稿者 ?-?  (その他) 投稿日時 2009/8/28 01:55:33
比較する文字列が両方とも数字かどうかチェックして、両方とも数字なら数値としての大小比較、そうじゃない場合は文字列として比較、でいいんじゃないの?
投稿者 SS  (学生) 投稿日時 2009/8/28 01:26:26
度々申し訳ありません。
すごく簡単な事かもしれませんが、質問させてください。

テキストボックスがいくつかあり、その中に

Textbox1.text = 1234
Textbox2.text = 1000
Textbox3.text = B
Textbox4.text = 111
TextBox5.text = A

という内容が入っているとき、これらを昇順でソートし、テキストボックスの中身を

Textbox1.text = 111
Textbox2.text = 1000
Textbox3.text = 1234
Textbox4.text = A
TextBox5.text = B

としたいのですが、大小比較で並び変えようとすると、

Textbox1.text = 1000
Textbox2.text = 111
Textbox3.text = 1234
Textbox4.text = A
TextBox5.text = B

となってしまいます。
integer型にすると数値はきれいにソートされると思いますが、A,Bでエラーが出ますし・・・

何かいい解決法は無いでしょうか。
お願いします。

現在のプログラムです

        Dim i As Integer
        Dim j As Integer
        Dim sort As Integer

  For i = 1 To 4
      For j = i + 1 To 5

           If Me.Controls("TextBox" & i).Text > Me.Controls("TextBox" & j).Text Then
               sort = Me.Controls("TextBox" & i).Text
               Me.Controls("TextBox" & i).Text = Me.Controls("TextBox" & j).Text
               Me.Controls("TextBox" & j).Text = sort
           End If

      Next
  Next