Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

22 Май 2022, 13:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Сортировка массива в памяти  (Прочитано 515 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 088


« Стартовое сообщение: 21 Апрель 2022, 16:00 »

Есть ли возможность отсортировать массив в памяти при помощи SQL? В MS Office я бы использовал для этой цели объект ADODB.Recordset: создал бы пустой объект в памяти, заполнил его и отсортировал посредством SQL, потом забрал бы обратно методом getRows().
« Последнее редактирование: 21 Апрель 2022, 16:11 от eeigor » Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
sokol92
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 909


WWW
« Ответ #1: 21 Апрель 2022, 16:23 »

Для Excel VBA указанный метод крайне не эффективен.

Для LO речь идет о Basic? О каком массиве?
Записан

Владимир.
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 088


« Ответ #2: 21 Апрель 2022, 16:23 »

О массиве массивов, 2D
Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
sokol92
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 909


WWW
« Ответ #3: 21 Апрель 2022, 16:28 »

Довольно быстро (обычно) можно загнать в диапазон ячеек, отсортировать, забрать обратно.
Либо взять один из методов быстрой сортировки массива на Basic (VBA), который возвращает массив индексов элементов в порядке возрастания значений этих элементов и поменять в тексте этого метода пару строк.
Например, этот (ему лет 20):

Код:
' lang:en
' Sort a one-dimensional array.
' - arr array (one-dimensional) returns an array of integers (index from 1) containing the indices of the Arr elements,
'   arranged in ascending order.
'
' The comparison is not case sensitive. If two elements have the same value, then the element with the lower index will follow first.
' If arr is not array, then returns False.
' lang:ru
' Сортировка одномерного массива.
' arr - массив (одномерный) возвращает массив целых чисел (индекс от 1), содержащий индексы элементов Arr,
' расположенных в возрастающем порядке.
' Сравнение производится без учета регистра. Если два элемента имеют одинаковое значение, то
' первым будет следовать элемент, имеющий меньший индекс.
' Если arr не является массивом, то возвращает False
Public Function QSort(ByVal arr As Variant) As Variant

    Dim i1 As Long, i2 As Long                        ' границы Arr
    Dim i As Long
    Dim k1 As Long, k2 As Long
    Dim w1, w2
    Dim IndSort() As Long
    Dim ind As Long

    Dim i_m, i_1, i_2 As Long

    If Not IsArray(arr) Then
        QSort = False
        Exit Function
    End If

    i1 = LBound(arr)
    i2 = UBound(arr)

    ind = i2 - i1 + 1

    ReDim IndSort(1 To ind)

    For i = 1 To ind
        IndSort(i) = i1 + i - 1
    Next i

    i_m = Int(ind / 2)

    While i_m > 0

        i_1 = i_m + 1


        While i_1 <= ind

            i_2 = i_1 - i_m

            Do While i_2 >= 1

                k1 = IndSort(i_2)
                k2 = IndSort(i_2 + i_m)

                w1 = arr(k1)
                w2 = arr(k2)

                If VarType(w1) = vbString Then
                    w1 = UCase(w1)
                End If

                If VarType(w2) = vbString Then
                    w2 = UCase(w2)
                End If

                If w1 > w2 Or (w1 = w2 And k1 > k2) Then    ' меняем местами индексы

                    IndSort(i_2) = k2
                    IndSort(i_2 + i_m) = k1

                    i_2 = i_2 - i_m

                Else
                    Exit Do
                End If

            Loop

            i_1 = i_1 + 1

        Wend

        i_m = Int(i_m / 2)
    Wend

    QSort = IndSort

End Function


Менять надо присвоения для w1, w2.
« Последнее редактирование: 21 Апрель 2022, 16:35 от sokol92 » Записан

Владимир.
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!