各言語でのリスト実装例

現代のプログラミングにおいて、リストやそれに相当するデータ構造は非常に重要な役割を果たしています。リストは、複数の要素を管理し、操作するための基本的かつ強力なツールです。たとえば、配列のように固定サイズで管理するデータ構造とは異なり、リストは要素の追加や削除が簡単に行える柔軟性を持っています。

この資料では、JavaC#をはじめとする主要なプログラミング言語におけるリストの実装と特徴について詳しく解説します。特に、JavaのArrayListやC#のList<T>は、動的なデータ操作を可能にする代表的なクラスであり、それぞれの言語でリストを使いこなすための基盤となります。

また、Python、C++、JavaScript、Go、Swift、Kotlin、Rustなど、他のプログラミング言語におけるリストの実装方法も併せて紹介します。これにより、複数の言語を学ぶ方や異なる環境で開発する方が、それぞれの言語に適したリストの使い方を理解し、効率的にプログラムを構築できるようになります。

リスト構造は、ゲーム開発やWebアプリケーションの構築、データ処理など、あらゆる分野で活用されています。


プログラム言語ごとの実装例

1. Java

Javaでは、Listインターフェースを実装するArrayListLinkedListを使用します。

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");
        list.remove(1);  // 要素の削除

        System.out.println(list);  // [Apple, Cherry]
        System.out.println(list.get(0));  // Apple
    }
}
  • 特徴:
    • ArrayListはC#のList<T>に最も近い。
    • ジェネリクスを使用して型安全。

2. C#

C#では、List<T>クラスが用意されています。

using System;
using System.Collections.Generic;

class Program 
{
    static void Main() 
    {
        List<string> list = new List<string>();
        list.Add("Apple");
        list.Add("Banana");
        list.Add("Cherry");
        list.Remove("Banana");  // 要素の削除

        Console.WriteLine(string.Join(", ", list));  // Apple, Cherry
        Console.WriteLine(list[0]);  // Apple
    }
}
  • 特徴:
    • 型指定をジェネリクスで行う。
    • 動的にサイズ変更可能。

3. Python

Pythonでは、組み込みのlistが使用されます。

my_list = [1, 2, 3]
my_list.append(4)  # 要素の追加
my_list.remove(2)  # 要素の削除

print(my_list)  # [1, 3, 4]
  • 特徴:
    • 型を指定せずに汎用的に利用可能。
    • 要素追加、削除、スライス操作が簡単。

4. C++

C++では、標準ライブラリ(STL)のstd::vectorstd::listを使用します。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};
    vec.push_back(4);  // 要素の追加
    vec.erase(vec.begin() + 1);  // 要素の削除

    for (int num : vec) {
        std::cout << num << " ";  // 1 3 4
    }

    return 0;
}
  • 特徴:
    • std::vectorは動的配列、std::listは連結リスト。
    • 高速な操作とメモリ効率を提供。

5. JavaScript

JavaScriptでは、Arrayがリストとして使用されます。

let list = [1, 2, 3];
list.push(4);  // 要素の追加
list.splice(1, 1);  // 要素の削除

console.log(list);  // [1, 3, 4]
  • 特徴:
    • サイズが動的に変更可能。
    • 高度な操作用メソッドが豊富。

6. Ruby

RubyではArrayがリストの役割を果たします。

list = [1, 2, 3]
list << 4  # 要素の追加
list.delete_at(1)  # 要素の削除

puts list.inspect  # [1, 3, 4]
  • 特徴:
    • 簡潔な記法で操作可能。
    • 柔軟性が高い。

7. Go

Goではスライス(slice)がリストのように機能します。

package main

import "fmt"

func main() {
    list := []int{1, 2, 3}
    list = append(list, 4)  // 要素の追加
    list = append(list[:1], list[2:]...)  // 要素の削除

    fmt.Println(list)  // [1, 3, 4]
}
  • 特徴:
    • スライスは動的配列として利用可能。
    • シンプルな記法で効率的。

8. Swift

SwiftではArrayがリストとして機能します。

var list = [1, 2, 3]
list.append(4)  // 要素の追加
list.remove(at: 1)  // 要素の削除

print(list)  // [1, 3, 4]
  • 特徴:
    • 型安全で、ジェネリクスにより型が明確。
    • C#のList<T>に似ている。

9. Kotlin

Kotlinでは、MutableListがリストとして使用されます。

fun main() {
    val list = mutableListOf(1, 2, 3)
    list.add(4)  // 要素の追加
    list.removeAt(1)  // 要素の削除

    println(list)  // [1, 3, 4]
}
  • 特徴:
    • 不変リストと可変リストを区別。
    • モダンで簡潔な記法。

10. Rust

RustではVec(ベクター)がリストとして使用されます。

fn main() {
    let mut list = vec![1, 2, 3];
    list.push(4);  // 要素の追加
    list.remove(1);  // 要素の削除

    println!("{:?}", list);  // [1, 3, 4]
}
  • 特徴:
    • 所有権モデルによる安全な設計。
    • 高速で効率的。

比較表

言語リストクラス/構造体主な特徴
JavaArrayList, LinkedListジェネリクス型、安全性が高い
C#List<T>型安全、動的サイズ変更
Pythonlist汎用的、スライス操作が可能
C++std::vector, std::list高速で効率的、用途に応じて選択可能
JavaScriptArray柔軟で高度な操作が可能
RubyArray簡潔な記法、柔軟性が高い
Goslice動的配列として設計
SwiftArray型安全、C#に似た設計
KotlinMutableList, List不変と可変リストをサポート
RustVec高速、安全、所有権モデル

各言語で特徴に若干の違いがありますが、どれも動的にサイズ変更可能で汎用的な用途に対応できるリスト構造です。

C#

Posted by hidepon