SlideShare uma empresa Scribd logo
1 de 22
Baixar para ler offline
Базовые сведения   Основные методы    Сортировка и экстремумы   Итераторы   Задания   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: хэши

Mais conteúdo relacionado

Mais procurados

Hubungan Antara Pendidikan dengan Kelas Sosial/Sistem Status
Hubungan Antara Pendidikan dengan Kelas Sosial/Sistem StatusHubungan Antara Pendidikan dengan Kelas Sosial/Sistem Status
Hubungan Antara Pendidikan dengan Kelas Sosial/Sistem StatusNida Alfathimy
 
Makalah Kewirausahaan dalam Bidang Jasa Pendidikan
Makalah Kewirausahaan dalam Bidang Jasa PendidikanMakalah Kewirausahaan dalam Bidang Jasa Pendidikan
Makalah Kewirausahaan dalam Bidang Jasa PendidikanSTKIP PGRI BANDAR LAMPUNG
 
Pinterest pour les nuls
Pinterest pour les nulsPinterest pour les nuls
Pinterest pour les nulsCéline Camoun
 
Model Motivasi ARCS
Model Motivasi ARCSModel Motivasi ARCS
Model Motivasi ARCStbpck
 
Perkembangan Peserta Didik serta Hubungannya dengan Proses Pembelajaran
Perkembangan Peserta Didik serta Hubungannya dengan Proses PembelajaranPerkembangan Peserta Didik serta Hubungannya dengan Proses Pembelajaran
Perkembangan Peserta Didik serta Hubungannya dengan Proses PembelajaranLutfi Koto
 
Faktor yang Mempengaruhi Perkembangan Pendidikan
Faktor yang Mempengaruhi Perkembangan PendidikanFaktor yang Mempengaruhi Perkembangan Pendidikan
Faktor yang Mempengaruhi Perkembangan PendidikanRizqiana Yogi Cahyaningtyas
 
STRATEGI PENGELOLAAN SEKOLAH BERBASIS MANAJEMEN PROSES
STRATEGI PENGELOLAAN  SEKOLAH BERBASIS MANAJEMEN PROSESSTRATEGI PENGELOLAAN  SEKOLAH BERBASIS MANAJEMEN PROSES
STRATEGI PENGELOLAAN SEKOLAH BERBASIS MANAJEMEN PROSESLula Montes
 
Penilaian Alternatif
Penilaian AlternatifPenilaian Alternatif
Penilaian Alternatiftbpck
 
teori belajar sosial dan humanistik
teori belajar sosial dan humanistikteori belajar sosial dan humanistik
teori belajar sosial dan humanistikQuratul Aini
 
Ms. Excel (kelas XI)
Ms. Excel (kelas XI)Ms. Excel (kelas XI)
Ms. Excel (kelas XI)Rusmi hafshah
 
Metode pembelajaran individu
Metode pembelajaran individuMetode pembelajaran individu
Metode pembelajaran individuNastiti Rahajeng
 
Kriptografi - Block Cipher dan CBC
Kriptografi - Block Cipher dan CBCKriptografi - Block Cipher dan CBC
Kriptografi - Block Cipher dan CBCKuliahKita
 
Materi : Struktur Data (2 Array)
Materi : Struktur Data (2 Array)Materi : Struktur Data (2 Array)
Materi : Struktur Data (2 Array)eka pandu cynthia
 
Pengertian AGP, PCI, ISA, EISA dan VESA
Pengertian AGP, PCI, ISA, EISA dan VESAPengertian AGP, PCI, ISA, EISA dan VESA
Pengertian AGP, PCI, ISA, EISA dan VESAFajar Sany
 
Alat pembelajaran
Alat pembelajaranAlat pembelajaran
Alat pembelajaranRomza Baher
 

Mais procurados (20)

Hubungan Antara Pendidikan dengan Kelas Sosial/Sistem Status
Hubungan Antara Pendidikan dengan Kelas Sosial/Sistem StatusHubungan Antara Pendidikan dengan Kelas Sosial/Sistem Status
Hubungan Antara Pendidikan dengan Kelas Sosial/Sistem Status
 
Makalah Kewirausahaan dalam Bidang Jasa Pendidikan
Makalah Kewirausahaan dalam Bidang Jasa PendidikanMakalah Kewirausahaan dalam Bidang Jasa Pendidikan
Makalah Kewirausahaan dalam Bidang Jasa Pendidikan
 
Pinterest pour les nuls
Pinterest pour les nulsPinterest pour les nuls
Pinterest pour les nuls
 
Model Motivasi ARCS
Model Motivasi ARCSModel Motivasi ARCS
Model Motivasi ARCS
 
Perkembangan Peserta Didik serta Hubungannya dengan Proses Pembelajaran
Perkembangan Peserta Didik serta Hubungannya dengan Proses PembelajaranPerkembangan Peserta Didik serta Hubungannya dengan Proses Pembelajaran
Perkembangan Peserta Didik serta Hubungannya dengan Proses Pembelajaran
 
Faktor yang Mempengaruhi Perkembangan Pendidikan
Faktor yang Mempengaruhi Perkembangan PendidikanFaktor yang Mempengaruhi Perkembangan Pendidikan
Faktor yang Mempengaruhi Perkembangan Pendidikan
 
STRATEGI PENGELOLAAN SEKOLAH BERBASIS MANAJEMEN PROSES
STRATEGI PENGELOLAAN  SEKOLAH BERBASIS MANAJEMEN PROSESSTRATEGI PENGELOLAAN  SEKOLAH BERBASIS MANAJEMEN PROSES
STRATEGI PENGELOLAAN SEKOLAH BERBASIS MANAJEMEN PROSES
 
Penilaian Alternatif
Penilaian AlternatifPenilaian Alternatif
Penilaian Alternatif
 
teori belajar sosial dan humanistik
teori belajar sosial dan humanistikteori belajar sosial dan humanistik
teori belajar sosial dan humanistik
 
Ms. Excel (kelas XI)
Ms. Excel (kelas XI)Ms. Excel (kelas XI)
Ms. Excel (kelas XI)
 
Algoritma Genetika
Algoritma GenetikaAlgoritma Genetika
Algoritma Genetika
 
Hebb, perceptro dan adaline
Hebb, perceptro dan adalineHebb, perceptro dan adaline
Hebb, perceptro dan adaline
 
Metode pembelajaran individu
Metode pembelajaran individuMetode pembelajaran individu
Metode pembelajaran individu
 
Progresivisme in education
Progresivisme in educationProgresivisme in education
Progresivisme in education
 
Kontruktivisme
KontruktivismeKontruktivisme
Kontruktivisme
 
Kriptografi - Block Cipher dan CBC
Kriptografi - Block Cipher dan CBCKriptografi - Block Cipher dan CBC
Kriptografi - Block Cipher dan CBC
 
Materi : Struktur Data (2 Array)
Materi : Struktur Data (2 Array)Materi : Struktur Data (2 Array)
Materi : Struktur Data (2 Array)
 
Pengertian AGP, PCI, ISA, EISA dan VESA
Pengertian AGP, PCI, ISA, EISA dan VESAPengertian AGP, PCI, ISA, EISA dan VESA
Pengertian AGP, PCI, ISA, EISA dan VESA
 
Pusat sumber belajar
Pusat sumber belajarPusat sumber belajar
Pusat sumber belajar
 
Alat pembelajaran
Alat pembelajaranAlat pembelajaran
Alat pembelajaran
 

Mais 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
 

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