Clojure: Поиск элемента в коллекции
Одним из частых вопросов новичков в Clojure является неразбериха с функцией contains?. Казалось бы, в чем может быть проблема? Из названия функции, создается ощущение, что функция проверяет, есть ли элемент в коллекции, однако не все так просто. Функция contains? проверяет наличие ключа в переданной коллекции, то есть не наличие элемента, а наличие ключа.
Примеры:
(contains? [10 20 30] 10) ; => false
; действительно, в векторе элемент с индексом 10 отсутствует
(contains? [10 20 30] 1) ; => true
; элемент с первым индексом в векторе есть и это число 20Как же тогда проверить, есть ли элемент в коллекции? Есть несколько способов:
- Вызвать метод Java
.contains(методы из Java вызываются с префиксной точкой); - С помощью функции
some; - С помощью множеств (set), объявляются с помощью символов
#{}, либо с помощью функцииset.
Рассмотрим все варианты:
; Java метод
(.contains [10 20 30] 10) ; => true
(.contains [10 20 30] 1) ; => false
; Функция some
(some (fn [elem] (= elem 3)) [1 2 3 4]) ; => true
(some (fn [elem] (= elem 6)) [1 2 3 4]) ; => nil
; Множества
(some #{3} [1 2 3 4]) ; => 3
(some #{6} [1 2 3 4]) ; => nil
; и еще множества
(def my-set (set [1 2 3 3 2])) ; => #{1 2 3}
(contains? my-set 2) ; => true
(contains? my-set 10) ; => falseЗадание
Реализуйте функцию my-contains?, которая проверяет, есть ли переданный элемент в коллекции. Для конвертации nil можно воспользоваться функцией boolean. Метод .contains использовать нельзя :)
Примеры:
(my-contains? [1 2 4 9] 2) ; => true
(my-contains? [1 2 4 9] 0) ; => false
(my-contains? [1 2 4 9] 9) ; => trueClojure: Поиск элемента в коллекции
Одним из частых вопросов новичков в Clojure является неразбериха с функцией contains?. Казалось бы, в чем может быть проблема? Из названия функции, создается ощущение, что функция проверяет, есть ли элемент в коллекции, однако не все так просто. Функция contains? проверяет наличие ключа в переданной коллекции, то есть не наличие элемента, а наличие ключа.
Примеры:
(contains? [10 20 30] 10) ; => false
; действительно, в векторе элемент с индексом 10 отсутствует
(contains? [10 20 30] 1) ; => true
; элемент с первым индексом в векторе есть и это число 20Как же тогда проверить, есть ли элемент в коллекции? Есть несколько способов:
- Вызвать метод Java
.contains(методы из Java вызываются с префиксной точкой); - С помощью функции
some; - С помощью множеств (set), объявляются с помощью символов
#{}, либо с помощью функцииset.
Рассмотрим все варианты:
; Java метод
(.contains [10 20 30] 10) ; => true
(.contains [10 20 30] 1) ; => false
; Функция some
(some (fn [elem] (= elem 3)) [1 2 3 4]) ; => true
(some (fn [elem] (= elem 6)) [1 2 3 4]) ; => nil
; Множества
(some #{3} [1 2 3 4]) ; => 3
(some #{6} [1 2 3 4]) ; => nil
; и еще множества
(def my-set (set [1 2 3 3 2])) ; => #{1 2 3}
(contains? my-set 2) ; => true
(contains? my-set 10) ; => falseЗадание
Реализуйте функцию my-contains?, которая проверяет, есть ли переданный элемент в коллекции. Для конвертации nil можно воспользоваться функцией boolean. Метод .contains использовать нельзя :)
Примеры:
(my-contains? [1 2 4 9] 2) ; => true
(my-contains? [1 2 4 9] 0) ; => false
(my-contains? [1 2 4 9] 9) ; => trueВаше упражнение проверяется по этим тестам
(ns contains-test
(:require [test-helper :refer [assert-solution]]
[index :refer [my-contains?]]))
(assert-solution
[[[1 2 4 9] 2] [[1 2 4 9] 0] [[1 2 4 9] 9]]
[true false true]
my-contains?)Решение учителя откроется через:
20:00
