LoginSignup
12
1

ベイビーステップで学ぶマップリストの値の操作⑤ -String.contains?の紹介

Last updated at Posted at 2023-12-14

こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はマップリストの要素を検索する方法を学びましたのでまとめます。

目次

1.Ectoスキーマからパターンマッチを使用してパラメータを取り出す
2.Ectoスキーマからパラメータを取り出して更新する(iex内のみ)
3.Enum.mapの紹介
4.Enum.filterの紹介
5.String.contains?の紹介(本記事)
6.Enum.intoの紹介
7.Map.putの紹介
8.(番外編)元データがマップ→リスト→マップのもう一段深い入れ子構造だったらどうするか?(Map.getの紹介)

目的

リストの要素がマップ(あるいはその逆)になっている場合に値を取り出して操作できるようになりたい。

実行環境

Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.14.3
Erlang v26.0.2
Phoenix v1.7.10

今回やりたいこと

前回、Enum.filterで要素を一つずつ取り出して条件に合ったものだけ取り出す方法を学んだので、検索条件に文字列検索を入れてみたい。

iex
results = [{1, "hogehoge"}, {4, "fugafuga"}, {5, "piyopiyo"}]
Enum.filter(results, fn {id, _name} -> id == 5 end) 
[{5, "piyopiyo"}]

String.contains?とは

第一引数の中に第二引数の文字列を含むかをチェックする。

これをEnum.filterの検索条件に入れこみます。

iex
Enum.filter(results, fn {_id, name} -> String.contains?(name, "piyopiyo") end)
[{5, "piyopiyo"}]
iex
Enum.filter(results, fn {_id, name} -> String.contains?(name, "iy") end)
[{5, "piyopiyo"}]

部分一致で検索していますね。

(余談)完全一致検索の場合

==を使うと完全一致検索になります。

iex
Enum.filter(results, fn {_id, name} -> name == "piyopiyo" end)
[{5, "piyopiyo"}]
iex
Enum.filter(results, fn {_id, name} -> name == "iy" end)    
[]

(途中経過)元データからここまでをパイプでつなげる

iex
users
|> Enum.map(&{&1.id, &1.name})
|> Enum.filter(fn {_id, name} -> String.contains?(name, "piyopiyo") end)
[{5, "piyopiyo"}]

~Elixirの国のご案内~

↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。

We Are The Alchemists, my friends!:bouquet:1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2

  1. @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。

  2. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

12
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
1