Data Structures: Hash-mapsλ︎
Associative collection of key value pairs
Useful for defining self-describing structured data (assuming meaningful key names are used)
A map is a key / value pair data structure. Keys are usually defined using a keyword, although they can be strings or anything else.
Keywords point to themselves, so using them for the keys makes it very easy to get values out of the map, or for updating existing values in the map.
Note Explore creating maps
{:key "value"}
{:key :value}
{"key" "value"}
("key" :value)
(:meaining-of-life 42)
{:a 1 :b 2 :c 3}
{:monday 1 :tuesday 2 :wednesday 3 :thursday 4 :friday 5 :saturday 6 :sunday 7}
{1 "Monday" 2 "Tuesday" 3 "Wednesday" 4 "Thursday" 5 "Friday" 6 "Saturday" 7 "Sunday"}
Hint::Comma characters are treated as white-spaceλ︎
The comma character is rarely used in Clojure hash-maps as it is ignored by Clojure. When coming from other languages, it may be initially comforting to include commas.
Nested data modelsλ︎
nested maps to create a hierarchy or path for data. This can add more context to the overall design
various types of data
Hint::One data structure to rule them allλ︎
It is preferred to have a single data structure to model the data of a system, which is them used by all the functions of that system. An example is in the state used for an application, e.g. Practicalli website practicalli.data namespace
If there is no logical connection between data across a system, then data should be grouped into one structure per namespace as a minimal approach.
Example use: Data setsλ︎
A collection of maps which have the same form, e.g. a vector of hash-maps with the same keys
Example: meteorological recordings
(def recording-station-876WA
[{:timestamp "2021-12-01T12:00" :location {:latitude 24.3453434 :longitude 10.348888} :temperature 12.4 :rainfail 0.1 :uv-level 0.4}
{:timestamp "2021-12-01T12:10" :location {:latitude 24.3453434 :longitude 10.348888} :temperature 12.6 :rainfail 0.1 :uv-level 0.45}
{:timestamp "2021-12-01T12:00" :location {:latitude 24.3453434 :longitude 10.348888} :temperature 12.9 :rainfail 0.1 :uv-level 0.5}])
Providing a collection of consistent hash-map data structures is very easy to work with in Clojure.
reduce
, filter
and map
functions can easily process this form of data as part of algorithms to interpret the meaning from a data set.
As each recording station creates the same types of data, then they can be merged by including the recording station id in the map