Сортировать Alphanumeri c Строка внутри массива - PullRequest
1 голос
/ 25 апреля 2020

У меня есть строковый массив в моем коде vb. net. Например:

arrayPartMarks
-------------
C90X61Y13B
C90X61Y13D
C90X61Y1B
C90X61Y1D
-------------

Я хочу отсортировать его в порядке возрастания следующим образом.

arrayPartMarks
-------------
C90X61Y1B
C90X61Y13B
C90X61Y1D
C90X61Y13D  
-------------

Я пытаюсь отсортировать его с помощью массива.

Array.Sort(arrayPartMarks)

и результат тот же:

arrayPartMarks
-------------
C90X61Y13B
C90X61Y13D
C90X61Y1B
C90X61Y1D
-------------

Можно ли как-нибудь его отсортировать?

Заранее спасибо

1 Ответ

3 голосов
/ 25 апреля 2020

Я предоставлю общее решение, и тогда вы сможете указать конкретные c подробности, потому что вы предоставили нам только один пример, который не объясняет все детали, необходимые для реального алгоритма. (РЕДАКТИРОВАТЬ: На самом деле я получил гораздо больше c, чем планировал)

Во-первых, нет ничего встроенного, что сделало бы это для вас, поэтому вы должны сами предоставить логи сравнения c. Есть несколько способов сделать это, но самый простой - использовать делегат Comparison(Of T), например,

Array.Sort(myArray, Function(x, y)
                        If x < y Then
                            Return -1
                        ElseIf x > y Then
                            Return 1
                        Else 'x = y
                            Return 0
                        End If
                    End Function)

. Делегат Comparison(Of T) ссылается на функцию, которая принимает два объекта типа T и возвращает Integer, который представляет их относительную величину. Если первый объект считается меньше второго, то возвращаемое значение должно быть меньше нуля, а если первый объект считается больше второго, то возвращаемое значение должно быть больше нуля. Если два объекта считаются равными, вернуть ноль. Положительные и отрицательные возвращаемые значения обычно равны 1 и -1 соответственно, но это не обязательно. Это означает, что, например, они могут быть результатом вычитания указанного свойства c цифра c, например

Array.Sort(myArray, Function(x, y) x.SomeIntegerProperty - y.SomeIntegerProperty)

На основании вашего примера похоже, что вы можете взять символы после первых восьми, а затем сортируйте сначала по последней букве и, если она совпадает, сортируйте по предыдущему значению di git там, где оно есть. Это может выглядеть так:

Array.Sort(myArray, Function(x, y)
                        'Get the last letter.
                        Dim xLetter = x.Last()
                        Dim yLetter = y.Last()

                        'Sort by letter if they are different.
                        If xLetter < yLetter Then
                            Return -1
                        ElseIf xLetter > yLetter Then
                            Return 1
                        End If

                        'Get the characters after the common prefix.
                        Dim xSuffix = x.Substring(8)
                        Dim ySuffix = y.Substring(8)

                        'Get a number from the suffix, zero if no digit present.
                        Dim xNumber = Val(xSuffix)
                        Dim yNumber = Val(ySuffix)

                        'Sort by number.
                        Return Math.Sign(xNumber - yNumber)
                    End Function)

Обратите внимание, что здесь я использовал лямбда-выражение, но вы также можете использовать обычный метод. Метод будет написан так:

Private Function CompareStrings(x As String, y As String) As Integer
    'Get the last letter.
    Dim xLetter = x.Last()
    Dim yLetter = y.Last()

    'Sort by letter if they are different.
    If xLetter < yLetter Then
        Return -1
    ElseIf xLetter > yLetter Then
        Return 1
    End If

    'Get the characters after the common prefix.
    Dim xSuffix = x.Substring(8)
    Dim ySuffix = y.Substring(8)

    'Get a number from the suffix, zero if no digit present.
    Dim xNumber = Val(xSuffix)
    Dim yNumber = Val(ySuffix)

    'Sort by number.
    Return Math.Sign(xNumber - yNumber)
End Function

, а затем будет использоваться так:

Array.Sort(myArray, AddressOf CompareStrings)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...