Как поместить массив случайных дат в хронологическом порядке? - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть массив дат, формат которого выглядит примерно так: 15.10.2005 или 2/10 / 2011.

Допустим, массив содержит 10 дат, некоторые из которых могут быть дубликатами.

arrDates (9) 'элементы 0-9 представляют 1 дату

Каков наилучший способ переупорядочить элементы так, чтобы они были в хронологическом порядке?

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

сначала вы должны сделать так, чтобы все даты имели одинаковую длину (замена отдельных цифр на формат 0 #), вы можете использовать функцию Format $ для их форматирования

Здесь как вы можете использоватьэто.

Затем вы можете использовать Array.Sort для их сортировки

Здесь как это можно сделать

Редактировать: Боб был прав.Метод сортировки массива недоступен в vb6.Так я изменил ссылку на статью, в которой объясняется, как вы можете самостоятельно написать алгоритм быстрой сортировки.

1 голос
/ 23 февраля 2012

Для коротких списков (массивов) вы можете использовать невидимый ListBox или изготовленный набор записей ADO, или вы можете вручную написать короткую процедуру сортировки.Производительность обычно не является большой проблемой, пока у вас нет больших списков для сортировки.

Вот пример использования временной коллекции.Он имеет то же преимущество, что и использование набора записей, поскольку он может нести многозначные элементы, что быстро становится неуклюжим при использовании многомерных массивов.Чтобы сделать это с помощью Collection, вы должны создать небольшой класс, содержащий значения (включая ключ сортировки), которые вы должны иметь при себе.

Этот конкретный подход может быть оптимизирован с помощью бинарного поиска вместо простогопоследовательный поиск (здесь «цикл J»):

Option Explicit

Private Sub Form_Load()
    Dim A(9) As String, B(9) As String
    Dim I As Integer, J As Integer

    'Create some data, here we'll use String values but Date,
    'Integer, Double, whatever work as well.
    Randomize
    For I = 0 To 9
        A(I) = CStr(Fix(Rnd() * 100000))
        A(I) = Right$(String$(5, "0") & A(I), 6)
    Next

    'Sort A() as B().  Could just as easily copy the results
    'back into A() instead.
    With New Collection
        For I = 0 To UBound(A)
            For J = 1 To .Count
                If A(I) <= .Item(J) Then
                    .Add A(I), , J
                    Exit For
                End If
            Next
            If J > .Count Then .Add A(I)
        Next

        For I = 1 To .Count
            B(I - 1) = .Item(I)
        Next
    End With

    'Print before and after.
    AutoRedraw = True
    Print "A", "B"
    Print
    For I = 0 To 9
        Print A(I), B(I)
    Next
End Sub

Конечно, с чем-то вроде «даты», представленной в виде строкового значения, вам все равно нужно его нормализовать для сортировки, как уже упоминали другие.Здесь это моделируется созданием значений String на основе чисел и заполнением начальными нулями для нормализации.

1 голос
/ 23 февраля 2012

Самый простой способ - это отформатировать их в формате ГГГГММДД, а затем отсортировать их лексически (лексикографически, символ за символом, в алфавитном порядке).Может быть, но неправильно, так как здесь у нас только цифры, но, увы.

...