配列完全マスターガイド – Python・JavaScript・Java徹底比較と実践活用法
配列とは?プログラミングの基本データ構造を理解
**配列(Array)**は、同じ型のデータを連続したメモリ領域に格納するデータ構造です。複数の値を一つの変数名で管理でき、インデックス(添字)を使って個別の要素にアクセスできます。
配列の基本概念
| 特徴 | 説明 | 例 |
|---|---|---|
| インデックス | 要素の位置を示す番号(0から開始) | arr[0], arr[1] |
| 要素 | 配列に格納された個々のデータ | [10, 20, 30] の 10 |
| 長さ | 配列に含まれる要素の数 | length, size |
主要プログラミング言語での配列操作
Python(リスト)
# 配列の作成と基本操作
numbers = [1, 2, 3, 4, 5]
print(numbers[0]) # 1(最初の要素)
print(numbers[-1]) # 5(最後の要素)
numbers.append(6) # 要素追加
print(len(numbers)) # 6(長さ取得)
JavaScript
// 配列の作成と基本操作
const numbers = [1, 2, 3, 4, 5];
console.log(numbers[0]); // 1
console.log(numbers[numbers.length - 1]); // 5
numbers.push(6); // 要素追加
console.log(numbers.length); // 6
Java
// 配列の作成と基本操作
int[] numbers = {1, 2, 3, 4, 5};
System.out.println(numbers[0]); // 1
System.out.println(numbers[numbers.length - 1]); // 5
// Javaの配列は固定サイズ(ArrayListを使用して動的配列を実現)
System.out.println(numbers.length); // 5
配列の基本操作パターン
1. 要素の検索
# Python
fruits = ["apple", "banana", "orange"]
index = fruits.index("banana") # 1
exists = "apple" in fruits # True
// JavaScript
const fruits = ["apple", "banana", "orange"];
const index = fruits.indexOf("banana"); // 1
const exists = fruits.includes("apple"); // true
2. 要素の追加・削除
# Python
arr = [1, 2, 3]
arr.append(4) # 末尾に追加: [1, 2, 3, 4]
arr.insert(1, 10) # 指定位置に追加: [1, 10, 2, 3, 4]
arr.remove(10) # 値で削除: [1, 2, 3, 4]
arr.pop() # 末尾削除: [1, 2, 3]
// JavaScript
let arr = [1, 2, 3];
arr.push(4); // 末尾に追加: [1, 2, 3, 4]
arr.splice(1, 0, 10); // 指定位置に追加: [1, 10, 2, 3, 4]
arr.splice(1, 1); // 指定位置削除: [1, 2, 3, 4]
arr.pop(); // 末尾削除: [1, 2, 3]
3. 配列の結合・分割
# Python
arr1 = [1, 2, 3]
arr2 = [4, 5, 6]
combined = arr1 + arr2 # [1, 2, 3, 4, 5, 6]
sliced = combined[1:4] # [2, 3, 4]
// JavaScript
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combined = arr1.concat(arr2); // [1, 2, 3, 4, 5, 6]
const sliced = combined.slice(1, 4); // [2, 3, 4]
実践的な配列活用パターン
1. データの変換・フィルタリング
# Python
numbers = [1, 2, 3, 4, 5, 6]
doubled = [x * 2 for x in numbers] # [2, 4, 6, 8, 10, 12]
evens = [x for x in numbers if x % 2 == 0] # [2, 4, 6]
total = sum(numbers) # 21
// JavaScript
const numbers = [1, 2, 3, 4, 5, 6];
const doubled = numbers.map(x => x * 2); // [2, 4, 6, 8, 10, 12]
const evens = numbers.filter(x => x % 2 === 0); // [2, 4, 6]
const total = numbers.reduce((sum, x) => sum + x, 0); // 21
2. ソート・並び替え
# Python
fruits = ["banana", "apple", "cherry"]
fruits.sort() # アルファベット順
numbers = [3, 1, 4, 1, 5]
sorted_desc = sorted(numbers, reverse=True) # [5, 4, 3, 1, 1]
// JavaScript
const fruits = ["banana", "apple", "cherry"];
fruits.sort(); // アルファベット順
const numbers = [3, 1, 4, 1, 5];
const sortedDesc = numbers.sort((a, b) => b - a); // [5, 4, 3, 1, 1]
3. 2次元配列(行列)の操作
# Python
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(matrix[1][2]) # 6(2行目3列目)
flat = [item for row in matrix for item in row] # [1, 2, 3, 4, 5, 6, 7, 8, 9]
// JavaScript
const matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
console.log(matrix[1][2]); // 6
const flat = matrix.flat(); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
配列のパフォーマンス特性
時間計算量の比較
| 操作 | 時間計算量 | 説明 |
|---|---|---|
| 要素アクセス | O(1) | インデックス直接指定 |
| 末尾追加 | O(1) | append(), push() |
| 先頭挿入 | O(n) | 全要素のシフトが必要 |
| 検索 | O(n) | 線形探索 |
| ソート | O(n log n) | 比較ベースソート |
メモリ効率的な配列操作
# Python - ジェネレータ式でメモリ節約
large_data = (x**2 for x in range(1000000)) # 遅延評価
first_10 = [next(large_data) for _ in range(10)]
# NumPy配列で高速計算
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
result = arr * 2 # ベクトル化演算
実務でよく使う配列操作パターン
1. データ集計・統計
# Python
sales_data = [100, 150, 200, 120, 180]
average = sum(sales_data) / len(sales_data) # 150.0
maximum = max(sales_data) # 200
minimum = min(sales_data) # 100
// JavaScript
const salesData = [100, 150, 200, 120, 180];
const average = salesData.reduce((sum, x) => sum + x) / salesData.length; // 150
const maximum = Math.max(...salesData); // 200
const minimum = Math.min(...salesData); // 100
2. 文字列処理
# Python
text = "Hello,World,Python"
words = text.split(",") # ["Hello", "World", "Python"]
joined = " ".join(words) # "Hello World Python"
// JavaScript
const text = "Hello,World,JavaScript";
const words = text.split(","); // ["Hello", "World", "JavaScript"]
const joined = words.join(" "); // "Hello World JavaScript"
3. データベース風操作
# Python
users = [
{"name": "太郎", "age": 25, "city": "東京"},
{"name": "花子", "age": 30, "city": "大阪"},
{"name": "次郎", "age": 35, "city": "東京"}
]
# フィルタリング
tokyo_users = [u for u in users if u["city"] == "東京"]
# ソート
sorted_by_age = sorted(users, key=lambda x: x["age"])
# マッピング
names = [u["name"] for u in users]
配列のメモリ管理と最適化
動的配列 vs 静的配列
# Python - 動的配列(自動拡張)
dynamic_list = []
for i in range(1000):
dynamic_list.append(i) # 容量が自動で拡張される
# 固定サイズ配列が必要な場合
import array
fixed_array = array.array('i', [1, 2, 3, 4, 5]) # 整数専用配列
大容量データの効率的処理
# Python
# メモリ効率的なデータ処理
def process_large_file(filename):
with open(filename) as f:
for line in f: # 一行ずつ処理(全体をメモリに読み込まない)
yield line.strip().split(",")
# チャンク単位での処理
def process_in_chunks(data, chunk_size=1000):
for i in range(0, len(data), chunk_size):
chunk = data[i:i + chunk_size]
yield chunk
高度な配列操作テクニック
1. 関数型プログラミングスタイル
# Python
from functools import reduce
numbers = [1, 2, 3, 4, 5]
# map, filter, reduce の組み合わせ
result = reduce(
lambda x, y: x + y,
filter(lambda x: x % 2 == 0,
map(lambda x: x**2, numbers))
) # 偶数の平方の合計: 20
// JavaScript
const numbers = [1, 2, 3, 4, 5];
const result = numbers
.map(x => x**2)
.filter(x => x % 2 === 0)
.reduce((sum, x) => sum + x, 0); // 20
2. 配列の深いコピー
# Python
import copy
original = [[1, 2], [3, 4]]
shallow = original.copy() # 浅いコピー
deep = copy.deepcopy(original) # 深いコピー
// JavaScript
const original = [[1, 2], [3, 4]];
const shallow = [...original]; // 浅いコピー
const deep = JSON.parse(JSON.stringify(original)); // 深いコピー(制限あり)
3. 配列の重複除去
# Python
numbers = [1, 2, 2, 3, 3, 3, 4]
unique = list(set(numbers)) # [1, 2, 3, 4]
# 順序を保持した重複除去
unique_ordered = list(dict.fromkeys(numbers))
// JavaScript
const numbers = [1, 2, 2, 3, 3, 3, 4];
const unique = [...new Set(numbers)]; // [1, 2, 3, 4]
よくあるエラーと対処法
1. インデックス範囲外エラー
# Python
arr = [1, 2, 3]
# arr[5] # IndexError
# 安全なアクセス
value = arr[5] if len(arr) > 5 else None
// JavaScript
const arr = [1, 2, 3];
// arr[5] は undefined(エラーにならない)
const value = arr.length > 5 ? arr[5] : null;
2. 参照渡しの注意点
# Python
original = [1, 2, 3]
reference = original # 参照渡し
reference.append(4)
print(original) # [1, 2, 3, 4] - 元の配列も変更される
# コピーを作成
copy_list = original.copy()
配列を使ったアルゴリズム実装
1. 二分探索
# Python
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
2. クイックソート
# Python
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quicksort(left) + middle + quicksort(right)
まとめ:配列マスターのポイント
配列の重要性
- プログラミングの基本データ構造
- データ処理の中核的役割
- アルゴリズム実装の基盤
効率的な配列操作
- 適切なデータ構造の選択
- メモリ使用量の考慮
- 時間計算量の理解
実践的な活用法
- データ変換・フィルタリング
- 集計・統計処理
- アルゴリズム実装
注意すべきポイント
- インデックス範囲外アクセス
- 参照渡しとコピーの違い
- パフォーマンスへの影響
配列をマスターすることで、効率的なデータ処理とアルゴリズム実装が可能になります。まずは基本的な操作から始めて、徐々に高度なテクニックを身につけていきましょう。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

