Calc: Сортировка: Еnable naturl sort

Автор eeigor, 20 января 2023, 22:39

0 Пользователи и 1 гость просматривают эту тему.

eeigor

Не могу 26.1 и др. (четыре последних пункта) поставить в начало списка. А почему? Ведь 2-ка в первой позиции меньше 3-ки (26.1 < 30) или 26.1 < 27). А символ # стоит раньше цифр в таблице символов... Или я неправ? И что означает естественная сортировка (natural sort)? Или это баг?
Скопируйте список ниже и вставьте на лист. Попробуйте решить задачу.
UPD. Пишут, что опция работает только тогда, когда содержимое ячейки не разделено пробелом, подчеркиванием и т. д.
Вероятно мои символы нарушают это правило ("и т.д."). Нет, сначала числа, потом текст...

№ группы
26
27
28
29
30
31
32
33
34
35
36
#0.1
#0.2
26.1
26.2

Должно быть вот так (расставлено вручную):

#0.1
#0.2
26
26.1
26.2
27
28
29
30
31
32
33
34
35
36
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#1
Где-то я про это читал.  :)
Натуральная сортировка текстов в вольном изложении.
Каждый непустой текст для сравнения разбивается на три части:
1. Префикс
2. Число (получается из подстроки, которая может быть интерпретирована как число)
3. Суффикс
Если число не найдено (то есть, в тексте нет цифр), то префикс будет равен всему тексту, а число и суффикс будут пустыми.

Для сравнения текстов сначала сравниваем префиксы (как тексты), затем (в случае равенства префиксов) числа. В случае равенства префиксов и чисел сравниваем суффиксы, вновь применяя этот алгоритм натуральной сортировки (разбиваем на три части, и т.д.).


Владимир.

eeigor

Цитата: eeigor от 20 января 2023, 22:39Должно быть вот так (расставлено вручную):

#0.1
#0.2
26
26.1
26.2
27
28
29
30
31
32
33
34
35
36
Всё равно здесь что-то не так с сортировкой на листе.
Обычный макрос сортирует значения правильно, если ему передать массив указанных значений.
Sub SortArray(ByRef aIn())
''' Called by: GetEntries()

Dim i%, j%, n%, tmp$

n = UBound(aIn)
For i = 1 to n
For j = 0 To n - i  'bubble sort
If aIn(j) > aIn(j + 1) Then  'ascending order
    ' Swap elements.
tmp = aIn(j): aIn(j) = aIn(j + 1): aIn(j + 1) = tmp
End If
Next j
Next i
End Sub  'SortArray

Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Цитата: eeigor от  1 апреля 2023, 00:59что-то не так с сортировкой на листе
Что именно?

При использовании макроса нужно иметь в виду, что в LO Basic числа меньше текстов (string).
Владимир.

eeigor

Владимир, скопируйте данные на лист и отсортируйте. Последний вариант с макросом верный.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Цитата: eeigor от  1 апреля 2023, 16:39скопируйте данные на лист и отсортируйте
Я это уже делал ранее.
1. Вставляем последовательность из стартового примера как текст в столбец A.

Сортируем с включенным параметром "Включить естественную сортировку". Результат:
26, 26.1, 26.2, 27, 28, ..., 36, #0.1, #0.2

Сортируем с выключенным параметром "Включить естественную сортировку". Результат:
#0.1, #0.2, 26, 26.1, 26.2, 27, 28, ..., 36.

2. Если вставлять данные из буфера обмена стандартным образом, то 26-38 будут вставлены как числа, #0.1, #0.2, 26.1, 26.2 как тексты (при условии, что разделителем дробной доли числа является запятая).

Естественно, что числа будут отсортированы перед текстами.

Сортируем с включенным параметром "Включить естественную сортировку". Результат:
26, 27, ..., 36, 26.1, 26.2, #0.1, #0.2

Сортируем с выключенным параметром "Включить естественную сортировку". Результат:
26, 27, ..., 36, #0.1, #0.2, 26.1, 26.2.

Макрос тоже разместит числа перед текстами, если, разумеется, Вы перед обращением к макросу не преобразуете числа в тексты.
Владимир.

eeigor

Так, понятно. Я добился нужного результата, когда явно изменил тип данных в столбце на текстовый. После этого вошел в каждую ячейку и нажал ввод. Числа стали текстом, и сортировка стала такой, какая нужна.
Или надо оценить значения заново через найти и заменить (скриншот).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community