プログラミングで文字列操作と同じくらいよく扱うのが、配列やリストの操作です。
複数のデータを管理する配列やリストには、様々な種類があり、用途に応じて使い分けることが重要となります。
本ブログでは、配列・リスト操作をどのようにしたら良いのかを、JavaScript、Python、Java、Ruby、Goの5つの言語についてまとめました。
そこで本記事では、5つの言語の配列・リスト操作を比較し、言語間でどんな違いがあるのか、どんな注意点があるのかについて解説します。
どの言語でも配列や連想配列が合ったりしますが、その使い方や制限事項などは言語によってバラバラで、比較してみると興味深い内容になっています。
普段から複数言語を使われている方は、復習のために見ていただきたいと思います。
これから新たな言語を学習しようと考えている方は、知っている言語と比較することで、学習効率が上がりますので、お役に立てていただければと思います。
各言語の詳細は、記事下部の関連記事にまとめておきますので、必要に応じてご覧いただければと思います。
プログラミング言語の配列・リスト操作まとめ
本ブログで採り上げた配列・リスト操作は以下の11種類となります。
それぞれ各言語で比較しながらまとめます。
- 配列・リストの種類
- 配列・リストの作成
- 配列・リストから値を取得する
- 配列・リストの長さ(要素数)を取得する
- 配列・リストに要素を追加する
- 配列・リストから要素を削除する
- 配列・リストをコピーする
- 配列・リストをループさせる
- 配列・リストの順番を入れ替える
- 配列・リスト同士を結合する
- 配列・リストを検索する
配列・リストの種類
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
・配列(Array型)
・連想配列(Object型)
・マップ(Map型)
|
配列は1要素1データ、連想配列とマップは1要素にkeyとvalueのセットが格納される。
|
Python
|
・リスト(可変長配列)
・タプル(固定長配列)
・辞書(連想配列)
・集合(set)
|
リスト、タプル、集合は1要素1データ、辞書は1要素にkeyとvalueのセットが格納される
|
Java
|
・配列(固定長配列)
・List(可変長配列)
・Map(連想配列)
・Set(集合)
|
配列、List、Setは1要素に1データ、Mapは1要素にkeyとvalueのセットが格納される
|
Ruby
|
・Array(配列)
・Hash(連想配列)
・Set(集合)
|
Array、Setは1要素に1データ、Hashは1要素にkeyとvalueのセットが格納される |
Go
|
・Array(固定長配列)
・Slice(可変長配列)
・Map(連想配列)
|
Array、Sliceは1要素に1データ、Mapは1要素にkeyとvalueのセットが格納される。
|
各言語ともに呼び方は異なりますが、概ね要素を自由に追加・削除できる可変長配列と、keyとvalueで構成される連想配列のデータ構造を持つ仕組みが用意されています。
プログラミングをする上ではこの2つのデータ構造は必須と言えるのでしょうね。
配列・リストの作成
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
直接代入、Array.of、コンストラクタに指定
|
|
Python
|
直接代入
|
|
Java
|
直接代入、クラスのnew、Arrays.asList
|
型に厳密
|
Ruby
|
直接代入
|
Setは組込みライブラリのため、requireが必要
|
Go
|
直接代入
|
型に厳密
|
ほとんどの言語では変数の宣言と同時に、値を代入することが可能ですが、Javaはそれが難しい(できなくはないがあまりやらない)言語になっています。
また、数値と文字列といった異なる型の要素を1つの配列・リストに格納できる言語と、厳密に定義した型どおりでないと格納できない言語など様々なです。
比較するとやはり、Javaは型に厳密でコードが冗長になってしまうがミスが起こりにくい、PythonやRubyはプログラミングは楽だがミスが起きやすいと言えるのかもしれません。
配列・リストから値を取得する
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
・配列:インデックス指定
・連想配列:keyを指定
・マップ:get()
|
|
Python
|
・リスト:インデックス指定
・タプル:インデックス指定
・辞書:keyを指定、get()
|
集合から直接値は取得できない
|
Java
|
・配列:インデックス指定
・List:get()にインデックス指定
・Map:get()にkey指定
|
Setから直接値は取得できない
|
Ruby
|
・Array:インデックス指定
・Hash:key指定、fetch()
|
Setから直接値は取得できない
|
Go
|
・Array:インデックス指定
・Slice:インデックス指定
・Map:key指定
|
ほとんどの言語で、順序が保証される配列などはインデックス指定、連想配列はkeyを指定して値を取得します。
集合に関しては、順序がないので、直接値を取得する手段がなく、一旦配列に変換するなどの操作が必要になります。
配列・リストの長さ(要素数)を取得する
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
・配列:length
・連想配列:keysで配列変換後length
・マップ:size
|
|
Python
|
・リスト:len
・タプル:len
・辞書:len
・集合:len
|
|
Java
|
・配列:length
・List:size
・Map:size
・Set:size
|
|
Ruby
|
・Array:sizeまたはlength
・Hash:sizeまたはlength
・Set:sizeまたはlength
|
|
Go
|
・Array:len
・Slice:len
・Map:len
|
まとめると、len(またはlength)かsizeのどちらかでした。
比較的先発のJavaとJavaScriptはバラけていて、後発のPythonとGoは統一されていて扱いやすくなっています。
Rubyがsizeでもlengthでも可能であるのは、ユーザフレンドリーな言語であると言えると思います。
配列・リストに要素を追加する
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
・配列:push、unshift、splice
・連想配列:keyとvalueを直接指定
・マップ:set
|
|
Python
|
・リスト:append、insert
・タプル:不可
・辞書:keyとvalueを直接指定
・集合:add
|
タプルは変更不可のため要素の追加はできない
|
Java
|
・配列:不可
・List:add
・Map:put
・Set:add
|
配列は変更不可のため要素の追加はできない
|
Ruby
|
・Array:push、<<、insert、unshift
・Hash:keyとvalueを直接指定、store
・Set:add、<<
|
|
Go
|
・Array:不可
・Slice:append
・Map:keyとvalueを直接指定
|
Arrayは変更不可のため要素の追加はできない
|
Rubyはできるだけ簡潔に記載できるような仕組みが用意されているのに対して、Javaは必ずメソッド経由にしているあたりに言語の設計思想を感じます。
後方に追加だけでなく、先頭や任意の場所に追加できるなど、各言語で様々な機能が提供されています。
配列・リストから要素を削除する
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
・配列:shift、pop、splice
・連想配列:delete
・マップ:delete
|
|
Python
|
・リスト:pop、remove、clear
・タプル:不可
・辞書:pop、popitem、clear
・集合:pop、remove、discard
|
タプルは変更不可のため要素の削除はできない
|
Java
|
・配列:不可
・List:remove、removeAll
・Map:remove
・Set:remove、removeAll
|
配列は変更不可のため要素の削除はできない
|
Ruby
|
・Array:pop、shift、delete、delete_at、clear
・Hash:delete、shift、clear
・Set:delete、clear
|
|
Go
|
・Array:不可
・Slice:自分で実装
・Map:delete
|
Arrayは変更不可のため要素の削除はできない
|
ほとんどの言語、配列・リストで削除するための手段が用意されています。
GoのSliceについては、専用の関数が用意されておらず、自分で削除したい要素を取り除いた新しいSliceを作成する実装をする必要があります。
配列・リストをコピーする
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
・配列:from、concat、slice、スプレッド構文
・連想配列:assign、スプレッド構文
|
|
Python
|
・リスト:copy、deepcopy
・タプル:copy、deepcopy
・辞書:copy、deepcopy、fromkeys
・集合:copy、deepcopy
|
|
Java
|
・配列:System.arraycopy
・List:コピー先のコンストラクタに指定
・Map:コピー先のコンストラクタに指定
・Set:コピー先のコンストラクタに指定
|
|
Ruby
|
・Array:dup、clone
・Hash:dup、clone
・Set:dup、clone
|
|
Go
|
・Array:コピー先に代入
・Slice:copy
・Map:自分で実装
|
配列・リストのコピーは、各言語で様々な方法が提供されていますが、利用する際は浅いコピーか深いコピーかを気をつける必要があります。
ほとんどのものは浅いコピーなので、基本的に浅いコピーと思っておいても良いかもしれません。
配列・リストをループさせる
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
・配列:for-of、forEach、map、filter、findなど
・連想配列:for-of-entries
・マップ:for-of
|
|
Python
|
・リスト:for-in、for-in-enumerate、for-in-zip、for-in-reversed
・タプル:(リストと同じ)
・辞書:for-in-keys、for-in-values、for-in-items
・集合:(リストと同じ)
|
|
Java
|
・配列:拡張for
・List:拡張for、forEach
・Map:拡張for、forEach
・Set:iterator、forEach
|
|
Ruby
|
・Array:for-in、each、each_index、each_with_index、reverse_each
・Hash:each、each_key、each_value
・Set:for-in、each
|
|
Go
|
・Array:for-range
・Slice:for-range
・Map:for-range
|
上記では、主に単純にループさせる方法を紹介していますが、ループ内の処理によって最適なメソッドや関数が用意されていたりもします。
ループは冗長になりがちだったり、パフォーマンスに影響を与えるところでもあるので、なるべく簡潔に効率の良いプログラミングを心がけたい部分です。
配列・リストの順番を入れ替える
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
・配列:sort、reverse、splice
|
|
Python
|
・リスト:sort
|
|
Java
|
・配列:Arrays.sort
・List:Collections.sort、独自Comparator
|
|
Ruby
|
・Array:sort、rotate、shuffle、reverse
・Hash:invert
|
|
Go
|
・Slice:sort
|
今回は要素の入れ替えを中心に紹介しましたが、要素の置換なども含めるともっと様々な方法があります。
なお、順番を持たないものや、標準で入れ替える手段を用意していないものは、記載を割愛しています。
配列・リスト同士を結合する
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
・配列:concat
・連想配列:assign、スプレッド構文
|
|
Python
|
・リスト:extends
|
|
Java
|
・配列:System.arraycopy、Stream
・List:addAll
・Map:putAll
・Set:addAll
|
|
Ruby
|
・Array:concat、+演算子
・Hash:merge
・Set:merge
|
|
Go
|
・Slice:append
|
今回は単純に配列・リスト同士の結合方法を紹介しましたが、要素の一部を結合など用途に応じて様々な方法があります。
配列・リストを検索する
言語 | 種類 | 注意点など |
---|---|---|
JavaScript
|
・配列:includes、indexOf
|
|
Python
|
・リスト:index、count
|
|
Java
|
・List:contains、indexOf
・Map:containsKey、containsValue
・Set:contains
|
|
Ruby
|
・Array:include?、index
・Hash:include?、index、has_key?、key?
・Set:include?、member?
|
|
Go
|
・Map:取得時の戻り値にて取得
|
配列・リスト操作は引出しをたくさん持っておくと便利
複数のデータを扱う種類はたくさんあり、用途に応じて使い分けが必要です。
さらに、同じ配列でもたくさんの操作方法が用意されています。
もちろんすべて覚える必要はないですが、自分がよく扱う操作は、一度整理しておくと良いと思います。
複数データを扱うということは、それだけ処理時間にも影響する可能性も高くなります。
ですから、より効率の良い方法を少ないコストで実現することがプログラマーにとっては腕の見せ所となります。
各言語ともにバージョンアップとともに、便利な操作が増えていたりしますので、最新情報を得ることも重要です。
今回はプログラミング言語別の配列・リスト操作をまとめてみました。
各言語の詳細は、下記の記事にめとめていますので、気になる方はご覧ください。
参考になれば幸いです。
コメント