Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Косячно работает сортировка / 20 сообщений из 20, страница 1 из 1
28.01.2010, 16:04
    #36436597
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
есть такой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
'----------------------------------------------------------------------------------------------------------------------------
' Данная функция сортирует массив по заданному направлению по указанному столбцу, по умолчанию направление по убыванию,
' но если в качестве 3ей переменной указать иное значение (не desc) то массив будет отсортирован по возрастанию
' Для использования функции должен быть объявлен непустой массив, 2ая переменная номер столбца,3я номер опционально направление
' в случае успешного выполнения функция принимает значение TRUE иначе FALSE
'----------------------------------------------------------------------------------------------------------------------------
Public Function SortArrayBubble(ByRef InArr() As Variant, ByVal ColNum As Integer, Optional direct As String = "desc") As Boolean
    SortArrayBubble = False
On Error GoTo endt

If ColNum <= UBound(InArr,  2 ) Then
Dim TempArr() As Variant
ReDim Preserve TempArr( 1 , UBound(InArr,  2 )) As Variant

If direct = "desc" Then
    For I =  2  To UBound(InArr,  1 )
        For J = UBound(InArr,  1 ) To I Step - 1 
        If UCase(InArr(J -  1 , ColNum)) < UCase(InArr(J, ColNum)) Then
            For K =  1  To UBound(InArr,  2 )
                TempArr( 1 , K) = InArr(J -  1 , K)
                InArr(J -  1 , K) = InArr(J, K)
                InArr(J, K) = TempArr( 1 , K)
            Next K
        End If
        
        Next J
    Next I

Else
    For I =  2  To UBound(InArr,  1 )
        For J = UBound(InArr,  1 ) To I Step - 1 
        If InArr(J -  1 , ColNum) > InArr(J, ColNum) Then
            For K =  1  To UBound(InArr,  2 )
                TempArr( 1 , K) = InArr(J -  1 , K)
                InArr(J -  1 , K) = InArr(J, K)
                InArr(J, K) = TempArr( 1 , K)
            Next K
        End If
        
        Next J
    Next I
End If
Erase TempArr
SortArrayBubble = True

End If
endt:

End Function

не сортирует следующий массив данных по столбику 3, причем по столбцу 2 все просто супер

4956 1062067001 0,1068
4956 1320674005 0,1000
4956 1320674014 0,1020
4956 1320674015 0,1013
4956 9039210810 0,1104
4956 1320649016 0,1479
4956 1320650001 0,1414
4956 1063830001 0,0932
4956 1321056008 0,0896
4956 1398800055 0,0839
4956 1398800056 0,0897
4956 1399900007 0,0879
4956 1399900008 0,0913
4956 1399900009 0,0899
4956 2400018483 0,0927
4956 2400018486 0,0954
4956 2400018516 0,0897
4956 3422109011 0,0839
4956 9009073818 0,1097
4956 9009073819 0,0947
4956 9009073821 0,0839

выдает бредовый результат
например запись
4956 1320649016 0,147
которая должна быть в топе, получается на 13-ой позиции
...
Рейтинг: 0 / 0
28.01.2010, 16:06
    #36436604
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
забыл указать
не работает именно сортировка ПО УБЫВАНИЮ.
ПО возрастанию все ок.
...
Рейтинг: 0 / 0
28.01.2010, 16:13
    #36436619
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Shamanus,

Эх, еще бы код вызова функции с предзаполнением масива и код его выброса на экран. Посмотрел бы, а самому заполнять лень
...
Рейтинг: 0 / 0
28.01.2010, 16:15
    #36436627
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Shocker.Pro,

cells можно поменять на принт дебаг

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Public Sub SORTING()
Dim InArr( 1  To  21 ,  1  To  3 ) As Variant

For I =  1  To UBound(InArr,  1 )
For J =  1  To UBound(InArr,  2 )
InArr(I, J) = Cells(I, J)
Next J
Next I



fgt = SortArrayBubble(InArr,  3 , "desc")

If ArrayIsEmpty(InArr) = False Then
For I =  1  To UBound(InArr,  1 )
For J =  1  To UBound(InArr,  2 )
Cells(I, J +  5 ) = InArr(I, J)
Next J
Next I
End If

fgt = SortArrayBubble(InArr,  2 , "desc")


If ArrayIsEmpty(InArr) = False Then
For I =  1  To UBound(InArr,  1 )
For J =  1  To UBound(InArr,  2 )
Cells(I, J +  10 ) = InArr(I, J)
Next J

Next I
End If

End Sub
...
Рейтинг: 0 / 0
28.01.2010, 16:19
    #36436637
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Shocker.Pro,

когда

UCASE из этой схемы выкидываю

Код: plaintext
If UCase(InArr(J -  1 , ColNum)) < UCase(InArr(J, ColNum)) Then

сортировка работает
выходит косяк в схеме UCASE со значениями типа DOUBLE
...
Рейтинг: 0 / 0
28.01.2010, 16:23
    #36436659
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
лучше так
а то из топика массив не выбирается
...
Рейтинг: 0 / 0
28.01.2010, 16:24
    #36436662
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Shamanus
выходит косяк в схеме UCASE со значениями типа DOUBLE



Как вы умудряетесь применять текстовую функцию к числу????
И главное - ЗАЧЕМ?
Разумеется, дело в этом.

И, разумеется, в этом случае даже целое число 5 у вас окажется больше, чем 35
...
Рейтинг: 0 / 0
28.01.2010, 16:25
    #36436669
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Shocker.Pro,

косяк...
получается функция которая сортирует не может быть универсальной и на входе надо определять тип данных?
...
Рейтинг: 0 / 0
28.01.2010, 16:27
    #36436680
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Код: plaintext
1.
?ucase( 5 )<ucase( 35 )
False

Почему не может? Может. Просто не применяйте UCase для числовых типов.
...
Рейтинг: 0 / 0
28.01.2010, 16:34
    #36436711
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
> Автор: Shamanus
> получается функция которая сортирует не может быть универсальной

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

> и на входе надо определять тип данных?

Так точно

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28.01.2010, 16:35
    #36436713
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Почитайте про

Код: plaintext
Option Compare {Binary | Text | Database}

Вам UCase вообще не понадобится
...
Рейтинг: 0 / 0
28.01.2010, 16:39
    #36436729
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Shocker.Pro,

ясно, свой затуп понял

9 будет больше 1 000 000

тогда встречный вопрос
как мне определить тип поля массива типа Variant?

пока надумал вариант типа равности исходного и преобразованного варианта
...
Рейтинг: 0 / 0
28.01.2010, 16:51
    #36436760
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Shamanusтогда встречный вопрос
как мне определить тип поля массива типа Variant?
пока надумал вариант типа равности исходного и преобразованного варианта


Не нужно вам это
Option Compare Text
замечательно работает для вашего случая (щас проверил)
...
Рейтинг: 0 / 0
28.01.2010, 17:17
    #36436864
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
> Автор: Shamanus
> тогда встречный вопрос
> как мне определить тип поля массива типа Variant?

Код: plaintext
1.
2.
3.
4.
5.
6.
Sub dfg()
Dim a( 1  To  2 ) As Variant
a( 1 ) =  2 . 45 
a( 2 ) = "dfhs"
Debug.Print VarType(a( 1 ))
Debug.Print VarType(a( 2 ))
End Sub


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28.01.2010, 18:06
    #36437051
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Игорь Горбонос,

О! очень напоминает типы полей рекордсета в Access.
Ясно спасибо!
...
Рейтинг: 0 / 0
28.01.2010, 18:07
    #36437053
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Shocker.Pro,

А после помещения этого в код что использовать? Ucase или без него?
...
Рейтинг: 0 / 0
28.01.2010, 18:09
    #36437058
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
ShamanusShocker.Pro,

А после помещения этого в код что использовать? Ucase или без него?

Без него.

То бишь ВМЕСТО Ucase
...
Рейтинг: 0 / 0
28.01.2010, 18:11
    #36437063
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
ShamanusО! очень напоминает типы полей рекордсета в Access.

Очень напоминает типы данных VB (к чему бы это )
...
Рейтинг: 0 / 0
28.01.2010, 18:15
    #36437077
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Shocker.Pro,

ну началось обсмеивание убогих , я же не это имел ввиду
спасибо
...
Рейтинг: 0 / 0
28.01.2010, 20:57
    #36437280
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Косячно работает сортировка
Игорь Горбонос
> Автор: Shamanus
> получается функция которая сортирует не может быть универсальной

Ну почему, можно и сделать, только всякая универсальность такого рода это жертвование быстродействием +1.Игорь Горбонос> и на входе надо определять тип данных?

Так точно Э-э-э... не совсем. Тип определяется множеством значений и множеством операций над значениями. Алгоритму сортировки не нужны значения как таковые, ему нужны операции: "сравнить", и какая-либо операция (или набор операций) для перемещения элементов. Таким образом, алгоритм может работать с интерфейсом, а не с конкретным типом данных. На более низком уровне при таком подходе "сама собой" получится сишная qsort().
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Косячно работает сортировка / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]