SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
Базовые сведения   Основные методы    Сортировка и экстремумы   Итераторы   Задания   References




                                       Ruby: хэши

                                       Информатика
                                       10-11 классы


                                     15 февраля 2012 г.




                     Информатика 10-11 классы     Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Введение



           Иногда возникает ситуация, когда применение массива
           является неудачным решением.
           Например, когда индексы расположены неравномерно, с
           большими пропусками, ведь как мы помним, ключи
           массива представляют собой последовательные
           натуральные числа + ноль.
           Эта проблема решается хэшами.
           Хэш это массив, ключами которого могут являться
           строки.




                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Хэши и массивы




                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы    Сортировка и экстремумы    Итераторы   Задания    References



Табличная форма

                                         Рассмотрим хэш с оценками.
                                         В ruby такой хэш записывается
                                         следующим образом:
         Ключ       Значение
                                     Listing 1: Создание хэша
        “kolya”        4
        “petya”        5                        hash = { " k o l y a "       =>   4,
                                                         " petya "           =>   5,
       “sergey”        5
                                                         " sergey "          =>   5,
      “mamba”          2                                 "mamba"             =>   2 }

                                         где hash      название массива.
                                         Чтобы вывести на экран, например, оценку
                                         Коли, достаточно написать
                                         puts hash["kolya"].



                     Информатика 10-11 классы       Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Создание хэша


           Зададим тестовый хэш телефонных кодов стран.

      Listing 2: Способы создания хэша
            h a s h = { " R u s s i a " => 7 , "USA" => 1 , "UK" => 44}

            h a s h = Hash . new ( o r h a s h = { } )
            hash [ " R u s s i a " ] = 7
            h a s h [ "USA" ] = 1
            h a s h [ "UK" ] = 44
            ...

           1 способ       обычный, 2            ручной.



                     Информатика 10-11 классы     Ruby: хэши
Базовые сведения     Основные методы   Сортировка и экстремумы    Итераторы   Задания   References



Методы работы с хэшем


     Рассмотрим хэш hash = { “vasya” => 5, “kolya” => 4, “petya” => 4 }.

       Метод                   Описание                                   Результат
       hash.size               количество пар                                 3
                               “ключ-значение”
       hash.keys               массив ключей*                       [“vasya”, “kolya”, “petya”]
       hash.values             массив значений*                              [5, 4, 4]
       hash.invert             поменять ключи и значения         {5 => “vasya”, 4 => “kolya”}
                               местами**
       hash.max                поиск максимальной пары                      [“vasya”, 5]
       hash.min                поиск минимальной пары                       [“kolya”, 4]
       hash.delete(“vasya”)    удалить элемент по ключу          { “kolya” => 4, “petya” => 4 }

     * хэши в ruby неупорядочены: массивы могут иметь любой порядок элементов.
     ** при “перевороте” в случае совпадения значений будет выбрано первое.




                       Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Методы работы с хэшем - 2



     Рассмотрим хэш hash = { “vasya” => 5, “kolya” => 4, “petya” => 4 }.

       Метод                     Описание                      Результат
       hash.empty?               есть ли хоть один элемент       false
       hash.key?(“vasya”)        есть ли в хэше элемент           true
                                 с ключом vasya
       hash.has_key?(“vasya”)    аналогично                       true
       hash.include?(“vasya”)    аналогично                       true
       hash.value?(3)            есть ли в хэше элемент           false
                                 со значением 3
       hash.has_value?(3)        аналогично                       false




                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Сортировка по ключу


           Как и массивы, хэши можно сортировать с помощью
           метода sort.
           Однако на выходе получается не хэш, а двумерный массив
           пар “ключ-значение”.
           Базово сортировка проводится по ключам, а не по
           значениям, как в массивах.

      Listing 3: Сортировка по ключам
              h a s h = { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25}
              hash_sorted = hash . s o r t
              puts hash_sorted . i n s p e c t
              # [ [ " a a c " , 2 5 ] , [ " abc " , 1 0 ] , [ " d e f " , 7 ] ]



                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы     Сортировка и экстремумы     Итераторы    Задания     References



Сортировка по значению


           Для сортировки по значению есть специальный метод
           sort_by.
           На выходе опять получается не хэш, а двумерный массив
           пар “ключ-значение”.

      Listing 4: Сортировка по ключам
              h a s h = { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25}
              h a s h _ s o r t e d = h a s h . s o r t _ b y { | key , v a l u e | v a l u e }
              puts hash_sorted . i n s p e c t
              # [ [ " d e f " , 7 ] , [ " abc " , 1 0 ] , [ " a a c " , 2 5 ] ]




                     Информатика 10-11 классы       Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы    Задания    References



Максимальный и минимальный элементы

           Максимальный и минимальный элементы хэша можно
           найти с помощью методов max, min, max_by, min_by.
           На выходе         массив из двух элементов (ключ и значение).
           Первые два метода ищут экстремум по ключу, вторые два
             по условию.

      Listing 5: Максимальный и минимальный элементы
               h a s h = { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25}
               p u t s h a s h . max # [ " d e f " , 7 ]
               p u t s h a s h . min # [ " a a c " , 2 5 ]
               p u t s h a s h . max_by{ | key , v a l u e | v a l u e } # [ " a a c " , 2 5 ]
               a r r = h a s h . min_by{ | key , v a l u e | v a l u e }
               puts arr # [" def " , 7]


                     Информатика 10-11 классы     Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы    Итераторы    Задания    References



Преобразование хэша в массив


           Иногда в целях удобства (или исходя из технических
           особенностей, как в методах sort_by и пр.) хэши
           преобразуют в двумерный массив пар “ключ–значение”.
           Для преобразования используется метод to_a.

      Listing 6: Преобразование в массив
               h a s h = { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25}
               a r r = h a s h . to_a

           В итоге в массив arr будет следующим: [ [“abd”, 10], [“def”, 7], [“aac”, 25] ]




                     Информатика 10-11 классы     Ruby: хэши
Базовые сведения   Основные методы     Сортировка и экстремумы       Итераторы     Задания      References



Итераторы

           Аналогично массивам для хэшей можно использовать
           методы map, find_all, inject.
           В качестве параметра–“ключа” внутри цикла появляется не
           просто обычная переменная, а массив из двух элементов
           ключа и значения!

      Listing 7: Итераторы
               hash   =   { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25}
               res1   =   h a s h . f i n d _ a l l { | a r r a y | a r r a y [ 1 ] < 20}
               res2   =   h a s h . map { | a r r a y | a r r a y [ 1 ] ∗ 2 }
               res3   =   h a s h . i n j e c t ( 0 ) { | r e s , a r r | r e s+a r r [ 1 ] }

           Что будет в каждой из переменных?



                      Информатика 10-11 классы       Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Результаты работы итераторов


           В переменной res1 окажется двумерный массив элементов,
           чьи значения меньше 20: [[“abc”, 10], [“def”, 7]]. Обратите
           внимание, что результатом вновь окажется именно массив,
           а не хэш.
           В переменной res2 окажется одномерный массив значений,
           умноженных на 2: [20, 50, 14].
           В переменной res3 будет находиться сумма всех значений
           хэша: 42.
           NB: Не забывайте, что переменная–ключ, используемая в
           итератора, в случае хэша является массивом из двух
           элементов ключа и значения!



                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы     Сортировка и экстремумы      Итераторы     Задания    References



Альтернативная запись итераторов


           Если массивы внутри итератора вызывают эстетическое
           отвращение, можно записать в виде переменных.
           Напишем ту же самую программу, но в другой форме.
           Обратите особое внимание на метод inject. Скобочки там
           стоят не для красоты!

      Listing 8: Альтернативная запись
               hash   =   { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25}
               res1   =   h a s h . f i n d _ a l l { | key , v a l u e | v a l u e < 20}
               res2   =   h a s h . map { | key , v a l u e | v a l u e ∗2 }
               res3   =   h a s h . i n j e c t ( 0 ) { | r e s , ( key , v a l u e ) | r e s+v a l u e }




                      Информатика 10-11 классы       Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Сумма


           Допустим даны оценки Васи: arr = [3, 5, 5, 4, 5, 2].
           Определим, сколько раз и какую Оценку Вася получил.

      Listing 9: Повторяемость
             arr = [3 , 5 , 5 , 4 , 5 , 2]
             marks = a r r . i n j e c t ( Hash . new{ 0 } ) { | r e s , elem |
                 r e s [ elem ] += 1
                 res
             }
             p u t s marks . i n s p e c t




                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Разбор программы

           В данном примере мы используем развёрнутую нотацию
           метода inject.
           Конструкция Hash.new{ 0 } означает: создать пустой хэш
           и сделать любой несуществующий элемент по умолчанию
           равным нулю.
           Алгоритм: заведём хэш res, в котором ключами будут
           оценки, а значениями их количество. Изначально
           каждой оценки 0 штук.
           Пробегаем по всему массиву arr. Берём пробегаемую
           оценку и увеличиваем количество этих оценок в хэше res
           на 1.
           Результат выполнения inject записываем в хэш marks.
           Для полного вывода на экран переменной используем
           специальный метод inspect.
                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Из массива в хэш



           Как преобразовать массив в хэш?
           Пусть дан массив arr. Как сделать чётные элементы
           ключами хэша, а нечётные значениями?

      Listing 10: Из массива в хэш
              a r r = [ " abc " , 1 0 , " d e f " , 7 ]
              h a s h = Hash [ ∗ a r r ]
              puts hash . i n s p e c t
              # {" abc "=>10, " d e f "=>7}




                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Из двумерного массива в хэш


           А если массив двумерный?
           Пусть дан двумерный массив “ключ–значение” arr.
           Сделаем из него хэш. Для этого сначала “сплющим”
           массив методом flatten.

      Listing 11: Из массива в хэш
              a r r = [ [ " abc " , 1 0 ] , [ " d e f " , 7 ] ]
              h a s h = Hash [ ∗ a r r . f l a t t e n ]
              puts hash . i n s p e c t
              # {" abc "=>10, " d e f "=>7}




                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Задания




           Дана строка s. Посчитать, сколько раз какое слово там
           встречается?
           Предыдущая задача, только вывести ТОП-10 часто
           встречающихся слов в порядке убывания.




                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Задания


           Дан массив строк arr. Каждая строка содержит
           информацию в следующем формате: дата (число из двух
           цифр, затем символ ТОЧКА, затем месяц из двух цифр.
           Примеры: 13.02, 01.01), символ ПРОБЕЛ, температура в
           виде вещественного числа. Пример правильно
           оформленной строки (одной из многих в массиве): “02.11
           -3.2”. Необходимо сосчитать среднемесячную температуру
           на каждый месяц, исходя из представленных данных и
           вывести её на экран по месяцам, начиная с января. Если на
           какой-либо месяц данные отсутствуют, то напротив этого
           месяца вывести словосочетание “данные отсутствуют”.



                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



Задания


           Дан двумерный массив, состоящий из двух одномерных
           массивов равной длины. Составить из этого массива хэш,
           ключами которого являются элементы первого
           подмассива, а значениями второго. Пример: arr = [
           [1,2,3], [4,5,6] ]. Из этого массива должен получиться хэш
           hash = { 1 => 4, 2 => 5, 3 => 6 }.
           Дан кусок текста в виде строковой переменной s.
           Посчитайте количество 10 любых союзов (например, “а”,
           “и”, “а то” и пр.) и выведите их в порядке встречаемости в
           тексте, начиная с самого часто встречающегося.
           Найти самое употребляемое слово во Вступлении к поэме
           А.С. Пушкина “Медный всадник”.


                     Информатика 10-11 классы    Ruby: хэши
Базовые сведения   Основные методы   Сортировка и экстремумы   Итераторы   Задания   References



References




           При подготовке данного материала использовались сайты:
           http://ru.wikibooks.org/wiki/Ruby, http://rubydev.ru,
           http://en.wikipedia.org, http://ruby-lang.org.
           Все презентации доступны на http://school.smirik.ru!
           Вопросы, предложения, д/з: smirik@gmail.com




                     Информатика 10-11 классы    Ruby: хэши

Contenu connexe

Tendances

Guide pratique openssl sous debian
Guide pratique openssl sous debianGuide pratique openssl sous debian
Guide pratique openssl sous debianyahyaf10
 
Web sockets - Pentesting
Web sockets - Pentesting Web sockets - Pentesting
Web sockets - Pentesting Vandana Verma
 
Operations, Consistency, Failover for Multi-DC Clusters (Alexander Dejanovski...
Operations, Consistency, Failover for Multi-DC Clusters (Alexander Dejanovski...Operations, Consistency, Failover for Multi-DC Clusters (Alexander Dejanovski...
Operations, Consistency, Failover for Multi-DC Clusters (Alexander Dejanovski...DataStax
 
Linux Binary Exploitation - Stack buffer overflow
Linux Binary Exploitation - Stack buffer overflowLinux Binary Exploitation - Stack buffer overflow
Linux Binary Exploitation - Stack buffer overflowAngel Boy
 
Practical Malware Analysis: Ch 15: Anti-Disassembly
Practical Malware Analysis: Ch 15: Anti-DisassemblyPractical Malware Analysis: Ch 15: Anti-Disassembly
Practical Malware Analysis: Ch 15: Anti-DisassemblySam Bowne
 
Hacktive Directory Forensics - HackCon18, Oslo
Hacktive Directory Forensics - HackCon18, OsloHacktive Directory Forensics - HackCon18, Oslo
Hacktive Directory Forensics - HackCon18, OsloYossi Sassi
 
Chaos Engineering 시작하기 - 윤석찬 (AWS 테크에반젤리스트) :: 한국 카오스엔지니어링 밋업
Chaos Engineering 시작하기 - 윤석찬 (AWS 테크에반젤리스트) ::  한국 카오스엔지니어링 밋업Chaos Engineering 시작하기 - 윤석찬 (AWS 테크에반젤리스트) ::  한국 카오스엔지니어링 밋업
Chaos Engineering 시작하기 - 윤석찬 (AWS 테크에반젤리스트) :: 한국 카오스엔지니어링 밋업Channy Yun
 
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduceRoman Brovko
 
Gerando Mapas de Rede Automatico - Zabbix API
Gerando Mapas de Rede Automatico - Zabbix API Gerando Mapas de Rede Automatico - Zabbix API
Gerando Mapas de Rede Automatico - Zabbix API Luiz Sales
 
Capture the Streams of Database Changes
Capture the Streams of Database ChangesCapture the Streams of Database Changes
Capture the Streams of Database Changesconfluent
 
Sự đặc thù của long thiên biểu
Sự đặc thù của long thiên biểuSự đặc thù của long thiên biểu
Sự đặc thù của long thiên biểuHoàng Lý Quốc
 
Arquitetura de Memoria do PostgreSQL
Arquitetura de Memoria do PostgreSQLArquitetura de Memoria do PostgreSQL
Arquitetura de Memoria do PostgreSQLRaul Oliveira
 
The Unintended Risks of Trusting Active Directory
The Unintended Risks of Trusting Active DirectoryThe Unintended Risks of Trusting Active Directory
The Unintended Risks of Trusting Active DirectoryWill Schroeder
 
[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기NAVER D2
 
Hermes Reliable Replication Protocol - Poster
Hermes Reliable Replication Protocol - Poster Hermes Reliable Replication Protocol - Poster
Hermes Reliable Replication Protocol - Poster Antonios Katsarakis
 

Tendances (16)

Guide pratique openssl sous debian
Guide pratique openssl sous debianGuide pratique openssl sous debian
Guide pratique openssl sous debian
 
Web sockets - Pentesting
Web sockets - Pentesting Web sockets - Pentesting
Web sockets - Pentesting
 
Operations, Consistency, Failover for Multi-DC Clusters (Alexander Dejanovski...
Operations, Consistency, Failover for Multi-DC Clusters (Alexander Dejanovski...Operations, Consistency, Failover for Multi-DC Clusters (Alexander Dejanovski...
Operations, Consistency, Failover for Multi-DC Clusters (Alexander Dejanovski...
 
Linux Binary Exploitation - Stack buffer overflow
Linux Binary Exploitation - Stack buffer overflowLinux Binary Exploitation - Stack buffer overflow
Linux Binary Exploitation - Stack buffer overflow
 
Practical Malware Analysis: Ch 15: Anti-Disassembly
Practical Malware Analysis: Ch 15: Anti-DisassemblyPractical Malware Analysis: Ch 15: Anti-Disassembly
Practical Malware Analysis: Ch 15: Anti-Disassembly
 
Hacktive Directory Forensics - HackCon18, Oslo
Hacktive Directory Forensics - HackCon18, OsloHacktive Directory Forensics - HackCon18, Oslo
Hacktive Directory Forensics - HackCon18, Oslo
 
Chaos Engineering 시작하기 - 윤석찬 (AWS 테크에반젤리스트) :: 한국 카오스엔지니어링 밋업
Chaos Engineering 시작하기 - 윤석찬 (AWS 테크에반젤리스트) ::  한국 카오스엔지니어링 밋업Chaos Engineering 시작하기 - 윤석찬 (AWS 테크에반젤리스트) ::  한국 카오스엔지니어링 밋업
Chaos Engineering 시작하기 - 윤석찬 (AWS 테크에반젤리스트) :: 한국 카오스엔지니어링 밋업
 
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
 
Tuned
TunedTuned
Tuned
 
Gerando Mapas de Rede Automatico - Zabbix API
Gerando Mapas de Rede Automatico - Zabbix API Gerando Mapas de Rede Automatico - Zabbix API
Gerando Mapas de Rede Automatico - Zabbix API
 
Capture the Streams of Database Changes
Capture the Streams of Database ChangesCapture the Streams of Database Changes
Capture the Streams of Database Changes
 
Sự đặc thù của long thiên biểu
Sự đặc thù của long thiên biểuSự đặc thù của long thiên biểu
Sự đặc thù của long thiên biểu
 
Arquitetura de Memoria do PostgreSQL
Arquitetura de Memoria do PostgreSQLArquitetura de Memoria do PostgreSQL
Arquitetura de Memoria do PostgreSQL
 
The Unintended Risks of Trusting Active Directory
The Unintended Risks of Trusting Active DirectoryThe Unintended Risks of Trusting Active Directory
The Unintended Risks of Trusting Active Directory
 
[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기
 
Hermes Reliable Replication Protocol - Poster
Hermes Reliable Replication Protocol - Poster Hermes Reliable Replication Protocol - Poster
Hermes Reliable Replication Protocol - Poster
 

Plus de Evgeny Smirnov

Внедряем MOOC'и на уроке информатики
Внедряем MOOC'и на уроке информатикиВнедряем MOOC'и на уроке информатики
Внедряем MOOC'и на уроке информатикиEvgeny Smirnov
 
Инновации которые не мешают
Инновации которые не мешаютИнновации которые не мешают
Инновации которые не мешаютEvgeny Smirnov
 
Мобильные приложения в школе
Мобильные приложения в школеМобильные приложения в школе
Мобильные приложения в школеEvgeny Smirnov
 
Порядок и хаос в Солнечной системе
Порядок и хаос в Солнечной системеПорядок и хаос в Солнечной системе
Порядок и хаос в Солнечной системеEvgeny Smirnov
 
Ruby: инкапсуляция и полиморфизм
Ruby: инкапсуляция и полиморфизмRuby: инкапсуляция и полиморфизм
Ruby: инкапсуляция и полиморфизмEvgeny Smirnov
 
Объектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в rubyОбъектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в rubyEvgeny Smirnov
 
Мобильные приложения в образовании
Мобильные приложения в образованииМобильные приложения в образовании
Мобильные приложения в образованииEvgeny Smirnov
 
NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.Evgeny Smirnov
 
Мастер-класс: LMS42, ч.2
Мастер-класс: LMS42, ч.2Мастер-класс: LMS42, ч.2
Мастер-класс: LMS42, ч.2Evgeny Smirnov
 
Мастер-класс: Anki карточки
Мастер-класс: Anki карточкиМастер-класс: Anki карточки
Мастер-класс: Anki карточкиEvgeny Smirnov
 
Мастер-класс: Quiz up
Мастер-класс: Quiz upМастер-класс: Quiz up
Мастер-класс: Quiz upEvgeny Smirnov
 
Мастер-класс: Dragonbox Algebra
Мастер-класс: Dragonbox AlgebraМастер-класс: Dragonbox Algebra
Мастер-класс: Dragonbox AlgebraEvgeny Smirnov
 
Мастер-класс: начало
Мастер-класс: началоМастер-класс: начало
Мастер-класс: началоEvgeny Smirnov
 
LMS42: основы (для мастер-класса)
LMS42: основы (для мастер-класса)LMS42: основы (для мастер-класса)
LMS42: основы (для мастер-класса)Evgeny Smirnov
 
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...Evgeny Smirnov
 
Образовательные и игровые платформы в помощь учителю и методисту
Образовательные и игровые платформы в помощь учителю и методистуОбразовательные и игровые платформы в помощь учителю и методисту
Образовательные и игровые платформы в помощь учителю и методистуEvgeny Smirnov
 
Педагогический клуб 18.10: LMS42
Педагогический клуб 18.10: LMS42Педагогический клуб 18.10: LMS42
Педагогический клуб 18.10: LMS42Evgeny Smirnov
 
Введение в алгоритмы
Введение в алгоритмыВведение в алгоритмы
Введение в алгоритмыEvgeny Smirnov
 

Plus de Evgeny Smirnov (20)

Внедряем MOOC'и на уроке информатики
Внедряем MOOC'и на уроке информатикиВнедряем MOOC'и на уроке информатики
Внедряем MOOC'и на уроке информатики
 
Инновации которые не мешают
Инновации которые не мешаютИнновации которые не мешают
Инновации которые не мешают
 
Мобильные приложения в школе
Мобильные приложения в школеМобильные приложения в школе
Мобильные приложения в школе
 
Порядок и хаос в Солнечной системе
Порядок и хаос в Солнечной системеПорядок и хаос в Солнечной системе
Порядок и хаос в Солнечной системе
 
Ruby: инкапсуляция и полиморфизм
Ruby: инкапсуляция и полиморфизмRuby: инкапсуляция и полиморфизм
Ruby: инкапсуляция и полиморфизм
 
Объектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в rubyОбъектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в ruby
 
Мобильные приложения в образовании
Мобильные приложения в образованииМобильные приложения в образовании
Мобильные приложения в образовании
 
Newtonew Media
Newtonew MediaNewtonew Media
Newtonew Media
 
NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.
 
Мастер-класс: LMS42, ч.2
Мастер-класс: LMS42, ч.2Мастер-класс: LMS42, ч.2
Мастер-класс: LMS42, ч.2
 
Мастер-класс: Anki карточки
Мастер-класс: Anki карточкиМастер-класс: Anki карточки
Мастер-класс: Anki карточки
 
Мастер-класс: Quiz up
Мастер-класс: Quiz upМастер-класс: Quiz up
Мастер-класс: Quiz up
 
Мастер-класс: Dragonbox Algebra
Мастер-класс: Dragonbox AlgebraМастер-класс: Dragonbox Algebra
Мастер-класс: Dragonbox Algebra
 
Мастер-класс: начало
Мастер-класс: началоМастер-класс: начало
Мастер-класс: начало
 
LMS42: основы (для мастер-класса)
LMS42: основы (для мастер-класса)LMS42: основы (для мастер-класса)
LMS42: основы (для мастер-класса)
 
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
 
Образовательные и игровые платформы в помощь учителю и методисту
Образовательные и игровые платформы в помощь учителю и методистуОбразовательные и игровые платформы в помощь учителю и методисту
Образовательные и игровые платформы в помощь учителю и методисту
 
Педагогический клуб 18.10: LMS42
Педагогический клуб 18.10: LMS42Педагогический клуб 18.10: LMS42
Педагогический клуб 18.10: LMS42
 
Блок-схемы
Блок-схемыБлок-схемы
Блок-схемы
 
Введение в алгоритмы
Введение в алгоритмыВведение в алгоритмы
Введение в алгоритмы
 

Хэши в ruby

  • 1. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Ruby: хэши Информатика 10-11 классы 15 февраля 2012 г. Информатика 10-11 классы Ruby: хэши
  • 2. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Введение Иногда возникает ситуация, когда применение массива является неудачным решением. Например, когда индексы расположены неравномерно, с большими пропусками, ведь как мы помним, ключи массива представляют собой последовательные натуральные числа + ноль. Эта проблема решается хэшами. Хэш это массив, ключами которого могут являться строки. Информатика 10-11 классы Ruby: хэши
  • 3. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Хэши и массивы Информатика 10-11 классы Ruby: хэши
  • 4. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Табличная форма Рассмотрим хэш с оценками. В ruby такой хэш записывается следующим образом: Ключ Значение Listing 1: Создание хэша “kolya” 4 “petya” 5 hash = { " k o l y a " => 4, " petya " => 5, “sergey” 5 " sergey " => 5, “mamba” 2 "mamba" => 2 } где hash название массива. Чтобы вывести на экран, например, оценку Коли, достаточно написать puts hash["kolya"]. Информатика 10-11 классы Ruby: хэши
  • 5. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Создание хэша Зададим тестовый хэш телефонных кодов стран. Listing 2: Способы создания хэша h a s h = { " R u s s i a " => 7 , "USA" => 1 , "UK" => 44} h a s h = Hash . new ( o r h a s h = { } ) hash [ " R u s s i a " ] = 7 h a s h [ "USA" ] = 1 h a s h [ "UK" ] = 44 ... 1 способ обычный, 2 ручной. Информатика 10-11 классы Ruby: хэши
  • 6. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Методы работы с хэшем Рассмотрим хэш hash = { “vasya” => 5, “kolya” => 4, “petya” => 4 }. Метод Описание Результат hash.size количество пар 3 “ключ-значение” hash.keys массив ключей* [“vasya”, “kolya”, “petya”] hash.values массив значений* [5, 4, 4] hash.invert поменять ключи и значения {5 => “vasya”, 4 => “kolya”} местами** hash.max поиск максимальной пары [“vasya”, 5] hash.min поиск минимальной пары [“kolya”, 4] hash.delete(“vasya”) удалить элемент по ключу { “kolya” => 4, “petya” => 4 } * хэши в ruby неупорядочены: массивы могут иметь любой порядок элементов. ** при “перевороте” в случае совпадения значений будет выбрано первое. Информатика 10-11 классы Ruby: хэши
  • 7. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Методы работы с хэшем - 2 Рассмотрим хэш hash = { “vasya” => 5, “kolya” => 4, “petya” => 4 }. Метод Описание Результат hash.empty? есть ли хоть один элемент false hash.key?(“vasya”) есть ли в хэше элемент true с ключом vasya hash.has_key?(“vasya”) аналогично true hash.include?(“vasya”) аналогично true hash.value?(3) есть ли в хэше элемент false со значением 3 hash.has_value?(3) аналогично false Информатика 10-11 классы Ruby: хэши
  • 8. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Сортировка по ключу Как и массивы, хэши можно сортировать с помощью метода sort. Однако на выходе получается не хэш, а двумерный массив пар “ключ-значение”. Базово сортировка проводится по ключам, а не по значениям, как в массивах. Listing 3: Сортировка по ключам h a s h = { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25} hash_sorted = hash . s o r t puts hash_sorted . i n s p e c t # [ [ " a a c " , 2 5 ] , [ " abc " , 1 0 ] , [ " d e f " , 7 ] ] Информатика 10-11 классы Ruby: хэши
  • 9. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Сортировка по значению Для сортировки по значению есть специальный метод sort_by. На выходе опять получается не хэш, а двумерный массив пар “ключ-значение”. Listing 4: Сортировка по ключам h a s h = { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25} h a s h _ s o r t e d = h a s h . s o r t _ b y { | key , v a l u e | v a l u e } puts hash_sorted . i n s p e c t # [ [ " d e f " , 7 ] , [ " abc " , 1 0 ] , [ " a a c " , 2 5 ] ] Информатика 10-11 классы Ruby: хэши
  • 10. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Максимальный и минимальный элементы Максимальный и минимальный элементы хэша можно найти с помощью методов max, min, max_by, min_by. На выходе массив из двух элементов (ключ и значение). Первые два метода ищут экстремум по ключу, вторые два по условию. Listing 5: Максимальный и минимальный элементы h a s h = { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25} p u t s h a s h . max # [ " d e f " , 7 ] p u t s h a s h . min # [ " a a c " , 2 5 ] p u t s h a s h . max_by{ | key , v a l u e | v a l u e } # [ " a a c " , 2 5 ] a r r = h a s h . min_by{ | key , v a l u e | v a l u e } puts arr # [" def " , 7] Информатика 10-11 классы Ruby: хэши
  • 11. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Преобразование хэша в массив Иногда в целях удобства (или исходя из технических особенностей, как в методах sort_by и пр.) хэши преобразуют в двумерный массив пар “ключ–значение”. Для преобразования используется метод to_a. Listing 6: Преобразование в массив h a s h = { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25} a r r = h a s h . to_a В итоге в массив arr будет следующим: [ [“abd”, 10], [“def”, 7], [“aac”, 25] ] Информатика 10-11 классы Ruby: хэши
  • 12. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Итераторы Аналогично массивам для хэшей можно использовать методы map, find_all, inject. В качестве параметра–“ключа” внутри цикла появляется не просто обычная переменная, а массив из двух элементов ключа и значения! Listing 7: Итераторы hash = { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25} res1 = h a s h . f i n d _ a l l { | a r r a y | a r r a y [ 1 ] < 20} res2 = h a s h . map { | a r r a y | a r r a y [ 1 ] ∗ 2 } res3 = h a s h . i n j e c t ( 0 ) { | r e s , a r r | r e s+a r r [ 1 ] } Что будет в каждой из переменных? Информатика 10-11 классы Ruby: хэши
  • 13. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Результаты работы итераторов В переменной res1 окажется двумерный массив элементов, чьи значения меньше 20: [[“abc”, 10], [“def”, 7]]. Обратите внимание, что результатом вновь окажется именно массив, а не хэш. В переменной res2 окажется одномерный массив значений, умноженных на 2: [20, 50, 14]. В переменной res3 будет находиться сумма всех значений хэша: 42. NB: Не забывайте, что переменная–ключ, используемая в итератора, в случае хэша является массивом из двух элементов ключа и значения! Информатика 10-11 классы Ruby: хэши
  • 14. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Альтернативная запись итераторов Если массивы внутри итератора вызывают эстетическое отвращение, можно записать в виде переменных. Напишем ту же самую программу, но в другой форме. Обратите особое внимание на метод inject. Скобочки там стоят не для красоты! Listing 8: Альтернативная запись hash = { " abc " => 1 0 , " d e f " => 7 , " a a c " => 25} res1 = h a s h . f i n d _ a l l { | key , v a l u e | v a l u e < 20} res2 = h a s h . map { | key , v a l u e | v a l u e ∗2 } res3 = h a s h . i n j e c t ( 0 ) { | r e s , ( key , v a l u e ) | r e s+v a l u e } Информатика 10-11 классы Ruby: хэши
  • 15. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Сумма Допустим даны оценки Васи: arr = [3, 5, 5, 4, 5, 2]. Определим, сколько раз и какую Оценку Вася получил. Listing 9: Повторяемость arr = [3 , 5 , 5 , 4 , 5 , 2] marks = a r r . i n j e c t ( Hash . new{ 0 } ) { | r e s , elem | r e s [ elem ] += 1 res } p u t s marks . i n s p e c t Информатика 10-11 классы Ruby: хэши
  • 16. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Разбор программы В данном примере мы используем развёрнутую нотацию метода inject. Конструкция Hash.new{ 0 } означает: создать пустой хэш и сделать любой несуществующий элемент по умолчанию равным нулю. Алгоритм: заведём хэш res, в котором ключами будут оценки, а значениями их количество. Изначально каждой оценки 0 штук. Пробегаем по всему массиву arr. Берём пробегаемую оценку и увеличиваем количество этих оценок в хэше res на 1. Результат выполнения inject записываем в хэш marks. Для полного вывода на экран переменной используем специальный метод inspect. Информатика 10-11 классы Ruby: хэши
  • 17. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Из массива в хэш Как преобразовать массив в хэш? Пусть дан массив arr. Как сделать чётные элементы ключами хэша, а нечётные значениями? Listing 10: Из массива в хэш a r r = [ " abc " , 1 0 , " d e f " , 7 ] h a s h = Hash [ ∗ a r r ] puts hash . i n s p e c t # {" abc "=>10, " d e f "=>7} Информатика 10-11 классы Ruby: хэши
  • 18. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Из двумерного массива в хэш А если массив двумерный? Пусть дан двумерный массив “ключ–значение” arr. Сделаем из него хэш. Для этого сначала “сплющим” массив методом flatten. Listing 11: Из массива в хэш a r r = [ [ " abc " , 1 0 ] , [ " d e f " , 7 ] ] h a s h = Hash [ ∗ a r r . f l a t t e n ] puts hash . i n s p e c t # {" abc "=>10, " d e f "=>7} Информатика 10-11 классы Ruby: хэши
  • 19. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Задания Дана строка s. Посчитать, сколько раз какое слово там встречается? Предыдущая задача, только вывести ТОП-10 часто встречающихся слов в порядке убывания. Информатика 10-11 классы Ruby: хэши
  • 20. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Задания Дан массив строк arr. Каждая строка содержит информацию в следующем формате: дата (число из двух цифр, затем символ ТОЧКА, затем месяц из двух цифр. Примеры: 13.02, 01.01), символ ПРОБЕЛ, температура в виде вещественного числа. Пример правильно оформленной строки (одной из многих в массиве): “02.11 -3.2”. Необходимо сосчитать среднемесячную температуру на каждый месяц, исходя из представленных данных и вывести её на экран по месяцам, начиная с января. Если на какой-либо месяц данные отсутствуют, то напротив этого месяца вывести словосочетание “данные отсутствуют”. Информатика 10-11 классы Ruby: хэши
  • 21. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References Задания Дан двумерный массив, состоящий из двух одномерных массивов равной длины. Составить из этого массива хэш, ключами которого являются элементы первого подмассива, а значениями второго. Пример: arr = [ [1,2,3], [4,5,6] ]. Из этого массива должен получиться хэш hash = { 1 => 4, 2 => 5, 3 => 6 }. Дан кусок текста в виде строковой переменной s. Посчитайте количество 10 любых союзов (например, “а”, “и”, “а то” и пр.) и выведите их в порядке встречаемости в тексте, начиная с самого часто встречающегося. Найти самое употребляемое слово во Вступлении к поэме А.С. Пушкина “Медный всадник”. Информатика 10-11 классы Ruby: хэши
  • 22. Базовые сведения Основные методы Сортировка и экстремумы Итераторы Задания References References При подготовке данного материала использовались сайты: http://ru.wikibooks.org/wiki/Ruby, http://rubydev.ru, http://en.wikipedia.org, http://ruby-lang.org. Все презентации доступны на http://school.smirik.ru! Вопросы, предложения, д/з: smirik@gmail.com Информатика 10-11 классы Ruby: хэши