Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

ソート祭りにこっそり参戦~いろはソート

待望されているのに実装処理系のない、いろはソートです。
ジェネリックを使えばいとかんたん。
しかし、アルゴリズムとは無縁のコードになるんですよね。肝心のアルゴリズムはBlackboxになってしまいます。
業務系VBerはますます、アルゴがら離れていく?

Public Class sort_Class
    '********
    Public dct重み As Dictionary(Of Char, Byte)
    Public Sub New()
        dct重み = New Dictionary(Of Char, Byte)
        dct重み.Add("い"c, 0) : dct重み.Add("ろ"c, 1) : dct重み.Add("は"c, 2) : dct重み.Add("に"c, 3) : dct重み.Add("ほ"c, 4) : dct重み.Add("へ"c, 5)
        dct重み.Add("と"c, 6) : dct重み.Add("ち"c, 7) : dct重み.Add("り"c, 8) : dct重み.Add("ぬ"c, 9) : dct重み.Add("る"c, 10) : dct重み.Add("を"c, 11)
        dct重み.Add("わ"c, 12) : dct重み.Add("か"c, 13) : dct重み.Add("よ"c, 14) : dct重み.Add("た"c, 15) : dct重み.Add("れ"c, 16) : dct重み.Add("そ"c, 17)
        dct重み.Add("つ"c, 18) : dct重み.Add("ね"c, 19) : dct重み.Add("な"c, 20) : dct重み.Add("ら"c, 21) : dct重み.Add("む"c, 22) : dct重み.Add("う"c, 23)
        dct重み.Add("ゐ"c, 24) : dct重み.Add("の"c, 25) : dct重み.Add("お"c, 26) : dct重み.Add("く"c, 27) : dct重み.Add("や"c, 28) : dct重み.Add("ま"c, 29)
        dct重み.Add("け"c, 30) : dct重み.Add("ふ"c, 31) : dct重み.Add("こ"c, 32) : dct重み.Add("え"c, 33) : dct重み.Add("て"c, 34) : dct重み.Add("あ"c, 35)
        dct重み.Add("さ"c, 36) : dct重み.Add("き"c, 37) : dct重み.Add("ゆ"c, 38) : dct重み.Add("め"c, 39) : dct重み.Add("み"c, 40) : dct重み.Add("し"c, 41)
        dct重み.Add("ゑ"c, 42) : dct重み.Add("ひ"c, 43) : dct重み.Add("も"c, 44) : dct重み.Add("せ"c, 45) : dct重み.Add("す"c, 46) : dct重み.Add("ん"c, 47)
    End Sub

    Function 比べる(ByVal x As String, ByVal y As String) As Integer
        Dim max As Integer = x.Length
        If max < y.Length Then max = y.Length
        '長さ調整
        If x.Length < max Then x.PadRight(max, " "c)
        If y.Length < max Then y.PadRight(max, " "c)

        For i As Integer = 0 To max - 1
            Dim bxc As Byte = dct重み(x(i))
            Dim byc As Byte = dct重み(y(i))

            If bxc = byc Then Continue For
            If bxc > byc Then
                Return 1
            ElseIf bxc < byc Then
                Return -1
            End If
        Next
        Return 0
    End Function
    '***************
    Public Sub RUN()
        Dim stringList As New List(Of String)
        stringList.Add("あさきり")
        stringList.Add("あさり")
        stringList.Add("あさひ")
        stringList.Add("いろは")
        stringList.Add("うえの")
        stringList.Add("えいこ")
        stringList.Add("おおさか")
        stringList.Add("かわせ")
        stringList.Add("きって")
        stringList.Add("くらぶ")
        stringList.Add("けしき")
        stringList.Add("こども")
        stringList.Sort(AddressOf 比べる)
        stringList.ForEach(AddressOf Console.WriteLine)
    End Sub
End Class

投稿日時 : 2008年7月8日 17:00

Feedback

# re: ソート祭りにこっそり参戦~いろはソート 2008/07/08 17:22 れい

濁点・半濁点はどうなってるのでしょう?

# re: ソート祭りにこっそり参戦~いろはソート 2008/07/08 19:01 Ognac

「いろは」表記では濁点半濁点は省略されていたり、促音拗音も省かれて表記されてることがあるようです。
旧仮名遣いで「てふてふ」「そうてせう」など、
そうかと思えば、【ワ゛】【ヰ゛】【ヱ゛】【ヲ゛】という表記もあったりして、ややこしそうです。ルール化でなく、パターン暗記で処理していたとも聞いてます。
ということで、今回のソートでは、濁点半濁点は、元の音と同じ重みということで......ダメかな?
MSのソート体系もバイナリと日本ロケールと辞書順とAccessソート順では結果が異なるようです。どうにかならないのでしょうかねぇ。

# re: ソート祭りにこっそり参戦~いろはソート 2008/07/08 19:46 れい

へぇ。
「いろは」では濁点半濁点に序数はないのですね。
では拗音や促音も無いのでしょうね。

それを考慮してソートするとなると、
ちょっとめんどくさいですねぇ。

# re: ソート祭りにこっそり参戦~いろはソート 2008/07/10 13:34 刈歩 菜良 CTP

もともと、
色は匂えど・・・
ですもんね。

タイトル
名前
Url
コメント