SlideShare ist ein Scribd-Unternehmen logo
1 von 22
Downloaden Sie, um offline zu lesen
Базовые сведения   Основные методы    Сортировка и экстремумы   Итераторы   Задания   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: хэши

Weitere ähnliche Inhalte

Was ist angesagt?

MySQL Day Roma - MySQL Shell and Visual Studio Code Extension
MySQL Day Roma - MySQL Shell and Visual Studio Code ExtensionMySQL Day Roma - MySQL Shell and Visual Studio Code Extension
MySQL Day Roma - MySQL Shell and Visual Studio Code ExtensionFrederic Descamps
 
Ibm informix security functionality overview
Ibm informix security functionality overviewIbm informix security functionality overview
Ibm informix security functionality overviewBeGooden-IT Consulting
 
Machine Learning Algorithm - Decision Trees
Machine Learning Algorithm - Decision Trees Machine Learning Algorithm - Decision Trees
Machine Learning Algorithm - Decision Trees Kush Kulshrestha
 
Feature Engineering
Feature EngineeringFeature Engineering
Feature EngineeringSri Ambati
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con HibernateMauro Gomez Mejia
 
Python Programming Essentials - M29 - Python Interpreter and Files
Python Programming Essentials - M29 - Python Interpreter and FilesPython Programming Essentials - M29 - Python Interpreter and Files
Python Programming Essentials - M29 - Python Interpreter and FilesP3 InfoTech Solutions Pvt. Ltd.
 
Multiple Choice Questions on JAVA (object oriented programming) bank 7 -- abs...
Multiple Choice Questions on JAVA (object oriented programming) bank 7 -- abs...Multiple Choice Questions on JAVA (object oriented programming) bank 7 -- abs...
Multiple Choice Questions on JAVA (object oriented programming) bank 7 -- abs...Kuntal Bhowmick
 
Bulk Loading Data into Cassandra
Bulk Loading Data into CassandraBulk Loading Data into Cassandra
Bulk Loading Data into CassandraDataStax
 
MySQL Workbench Tutorial | Introduction To MySQL Workbench | MySQL DBA Traini...
MySQL Workbench Tutorial | Introduction To MySQL Workbench | MySQL DBA Traini...MySQL Workbench Tutorial | Introduction To MySQL Workbench | MySQL DBA Traini...
MySQL Workbench Tutorial | Introduction To MySQL Workbench | MySQL DBA Traini...Edureka!
 
PCA (Principal Component Analysis)
PCA (Principal Component Analysis)PCA (Principal Component Analysis)
PCA (Principal Component Analysis)Luis Serrano
 
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDD
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDDREPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDD
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDDSandra Campos
 
Java Hibernate Programming with Architecture Diagram and Example
Java Hibernate Programming with Architecture Diagram and ExampleJava Hibernate Programming with Architecture Diagram and Example
Java Hibernate Programming with Architecture Diagram and Examplekamal kotecha
 
k Nearest Neighbor
k Nearest Neighbork Nearest Neighbor
k Nearest Neighborbutest
 
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2Justin Lin
 

Was ist angesagt? (20)

MySQL Day Roma - MySQL Shell and Visual Studio Code Extension
MySQL Day Roma - MySQL Shell and Visual Studio Code ExtensionMySQL Day Roma - MySQL Shell and Visual Studio Code Extension
MySQL Day Roma - MySQL Shell and Visual Studio Code Extension
 
Ibm informix security functionality overview
Ibm informix security functionality overviewIbm informix security functionality overview
Ibm informix security functionality overview
 
Machine Learning Algorithm - Decision Trees
Machine Learning Algorithm - Decision Trees Machine Learning Algorithm - Decision Trees
Machine Learning Algorithm - Decision Trees
 
Feature Engineering
Feature EngineeringFeature Engineering
Feature Engineering
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con Hibernate
 
Expert systems
Expert systemsExpert systems
Expert systems
 
JDBC
JDBCJDBC
JDBC
 
Weka classification
Weka classificationWeka classification
Weka classification
 
Python Programming Essentials - M29 - Python Interpreter and Files
Python Programming Essentials - M29 - Python Interpreter and FilesPython Programming Essentials - M29 - Python Interpreter and Files
Python Programming Essentials - M29 - Python Interpreter and Files
 
Multiple Choice Questions on JAVA (object oriented programming) bank 7 -- abs...
Multiple Choice Questions on JAVA (object oriented programming) bank 7 -- abs...Multiple Choice Questions on JAVA (object oriented programming) bank 7 -- abs...
Multiple Choice Questions on JAVA (object oriented programming) bank 7 -- abs...
 
Bulk Loading Data into Cassandra
Bulk Loading Data into CassandraBulk Loading Data into Cassandra
Bulk Loading Data into Cassandra
 
MySQL Workbench Tutorial | Introduction To MySQL Workbench | MySQL DBA Traini...
MySQL Workbench Tutorial | Introduction To MySQL Workbench | MySQL DBA Traini...MySQL Workbench Tutorial | Introduction To MySQL Workbench | MySQL DBA Traini...
MySQL Workbench Tutorial | Introduction To MySQL Workbench | MySQL DBA Traini...
 
PCA (Principal Component Analysis)
PCA (Principal Component Analysis)PCA (Principal Component Analysis)
PCA (Principal Component Analysis)
 
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDD
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDDREPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDD
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDD
 
XGBoost & LightGBM
XGBoost & LightGBMXGBoost & LightGBM
XGBoost & LightGBM
 
Java Hibernate Programming with Architecture Diagram and Example
Java Hibernate Programming with Architecture Diagram and ExampleJava Hibernate Programming with Architecture Diagram and Example
Java Hibernate Programming with Architecture Diagram and Example
 
Support vector machines
Support vector machinesSupport vector machines
Support vector machines
 
k Nearest Neighbor
k Nearest Neighbork Nearest Neighbor
k Nearest Neighbor
 
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
 
Adbms lab manual
Adbms lab manualAdbms lab manual
Adbms lab manual
 

Mehr von 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
 

Mehr von 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: хэши