Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка массива, обратная сортировка 
V
    Опции темы
timich
Дата 4.3.2009, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Всем привет! 
Подскажите пожалуйста как отсортировать массив.
Есть Array.Sort(Мас7) , а как отсортировать в обратной последовательности??
PM MAIL   Вверх
-Mikle-
Дата 4.3.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



У Array.Sort(...) есть еще пареметр, принимающий интерфейс System.Collections.IComparer и подобные ему... юзай, и будет тебе счастье!


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
diadiavova
Дата 4.3.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



System.Collections.IComparer - очень полезная штука, когда нужна какая-нибудь специфическая сортировка. В данном же случае дотаточно будет использовать функцию Array.Reverse после сортировки. Она меняет порядок на противоположный.

Это сообщение отредактировал(а) diadiavova - 4.3.2009, 11:23


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
timich
Дата 4.3.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



С System.Collections.IComparer разобраться не смог, а реверс, то что нужно.
Спасибо всем!
PM MAIL   Вверх
-Mikle-
Дата 4.3.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



Если массив большой, то вызов Array.Reverse будет занимать дополнительное время. Я не смотрел код метода Array.Reverse, но предполагаю, что там цикл длинной в половину размера массива.

А сортировка с указанием System.Collections.IComparer, столько же, сколько и сортировка без его указания (по умолчанию).

timich, если еще нужно, я выложу код здесь...



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
timich
Дата 4.3.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Выкладывай конечно! Я же учусь))
Если можно с пояснениями.
PM MAIL   Вверх
-Mikle-
Дата 4.3.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



Ну вот:

Код

    ' Это массив Integer. Инициализируем его тестовыми значениями
    Private arr() As Integer = New Integer() {4, 26, 14, 8, 93, 2, 245}

    Private Sub TestSort()
        ' Сортируем массив.
        ' В качестве второго параметра передаем функцию, которая будет
        ' вызываться для сравнения двух значений
        Array.Sort(arr, AddressOf CompareValues)
    End Sub

    Private Function CompareValues(ByVal val1 As Integer, ByVal val2 As Integer) As Integer
        ' Результатом функции должно быть одно из трех значений
        ' (-1) - если val1 < val2
        ' (0)  - если val1 = val2
        ' (1)  - если val1 > val2

        ' прямая сортировка, сравниваем val1 с val2
        'Return val1.CompareTo(val2)

        ' обратная сортировка, сравниваем val2 с val1
        Return val2.CompareTo(val1)
    End Function


Думаю, что все более чем понятно! Если исключить все коментарии, то получится ровно три строчки кода. По моему, проще некуда  smile 
Тебе нужно скопировать отсюда только функцию CompareValues.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
timich
Дата 4.3.2009, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Спасибо! Буду пробовать.
PM MAIL   Вверх
diadiavova
Дата 5.3.2009, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(-Mikle- @  4.3.2009,  15:32 Найти цитируемый пост)
Если массив большой, то вызов Array.Reverse будет занимать дополнительное время.

Ну дык...за удобство надо платить.

Цитата(-Mikle- @  4.3.2009,  18:04 Найти цитируемый пост)
Если исключить все коментарии, то получится ровно три строчки кода. По моему, проще некуда

Есть куда, можно и в две строчки
Код

    Private arr() As Integer = New Integer() {4, 26, 14, 8, 93, 2, 245}
    Private Sub TestSort()
        Array.Sort(arr, Function(a As Integer, b As Integer) b.CompareTo(a))
    End Sub



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
timich
Дата 5.3.2009, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Мне показалось, что не так.......(-1) - если val1 < val2
а вот так.....................................(-1) - если val1 > val2
ошибаюсь?
PM MAIL   Вверх
diadiavova
Дата 5.3.2009, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Вообще: эта функция должна возвращать отрицательное число, если первый аргумент имеет более высокий приоритет сортировки, 0 - если приоритеты равны, и положительное число - если второй аргумент имеет более высокий проритет(кажись так).
Более высокий приоритет означает, что в отсортированной коллекции элемент стоит раньше элементов с более низким приоритетом.

Для чисел такая функция может быть реализована так

Код

'Сортирует в порядке возрастания
Function CompareAsc(ByVal first As Integer, ByVal second As Integer) As Integer
    Return first - second
End Function

'Сортирует в порядке убывания
Function CompareDesc(ByVal first As Integer, ByVal second As Integer) As Integer
    Return  second - first
End Function

End Function


А вообще, почитай здесь.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
timich
Дата 5.3.2009, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Большое спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.