プログラミング言語の配列・リスト操作まとめ

プログラミング
スポンサーリンク

プログラミングで文字列操作と同じくらいよく扱うのが、配列やリストの操作です。

複数のデータを管理する配列やリストには、様々な種類があり、用途に応じて使い分けることが重要となります。

本ブログでは、配列・リスト操作をどのようにしたら良いのかを、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:取得時の戻り値にて取得

配列・リスト操作は引出しをたくさん持っておくと便利

複数のデータを扱う種類はたくさんあり、用途に応じて使い分けが必要です。

さらに、同じ配列でもたくさんの操作方法が用意されています。

もちろんすべて覚える必要はないですが、自分がよく扱う操作は、一度整理しておくと良いと思います。

複数データを扱うということは、それだけ処理時間にも影響する可能性も高くなります。

ですから、より効率の良い方法を少ないコストで実現することがプログラマーにとっては腕の見せ所となります。

各言語ともにバージョンアップとともに、便利な操作が増えていたりしますので、最新情報を得ることも重要です。

今回はプログラミング言語別の配列・リスト操作をまとめてみました。

各言語の詳細は、下記の記事にめとめていますので、気になる方はご覧ください。

参考になれば幸いです。

関連記事

JavaScriptの配列・リスト操作【プログラミング初心者向け教材】
プログラミングで文字列操作と同じくらいよく扱うのが、配列やリストの操作です。 本記事では、JavaScriptの配列・リストについて、種類と操作方法をまとめました。
Pythonの配列・リスト操作【プログラミング初心者向け教材】
プログラミングで文字列操作と同じくらいよく扱うのが、配列やリストの操作です。 本記事では、Pythonの配列・リストについて、種類と操作方法をまとめました。
Javaの配列・リスト操作【プログラミング初心者向け教材】
プログラミングで文字列操作と同じくらいよく扱うのが、配列やリストの操作です。 本記事では、Javaの配列・リストについて、種類と操作方法をまとめました。
Rubyの配列・リスト操作【プログラミング初心者向け教材】
プログラミングで文字列操作と同じくらいよく扱うのが、配列やリストの操作です。 本記事では、Rubyの配列・リストについて、種類と操作方法をまとめました。
Goの配列・リスト操作【プログラミング初心者向け教材】
プログラミングで文字列操作と同じくらいよく扱うのが、配列やリストの操作です。 本記事では、Goの配列・リストについて、種類と操作方法をまとめました。

コメント

タイトルとURLをコピーしました