List を模倣したようなカスタムのリストクラス ListInt
全体の模擬コード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace List12_1
{
internal class Program
{
static void Main(string[] args)
{
ListInt lines = new ListInt();
lines.Add(10);
lines.Add(20);
lines.Add(30);
lines.Add(40);
lines.Add(50);
lines.Add(60);
}
}
}
using System;
namespace List12_1
{
internal class ListInt
{
private int[] items;
private int count;
public ListInt()
{
items = new int[4];
count = 0;
}
public int Count
{
get
{
return count;
}
}
public void Add(int item)
{
if (count == items.Length)
{
Resize();
}
items[count] = item;
count++;
}
private void Resize()
{
int[] newArray = new int[items.Length * 2];
for (int i = 0; i < items.Length; i++)
{
newArray[i] = items[i];
}
items = newArray;
}
}
}
Main
メソッド
内容:
- カスタムクラス
ListInt
のインスタンスlines
を作成します。 - リストに 10, 20, 30, 40, 50, 60 の値を順番に追加します。
ListInt lines = new ListInt();
lines.Add(10);
lines.Add(20);
lines.Add(30);
lines.Add(40);
lines.Add(50);
lines.Add(60);
ListInt
クラス
カスタムリストの設計:
- 目的: 標準の
List<int>
に似た動作を実現するクラスです。 - 主要なプロパティとメソッド:
private int[] items;
実際にデータを格納するための配列。private int count;
配列に格納されている要素の数を追跡します。public ListInt()
配列を初期化するコンストラクター。public int Count { get; }
現在の要素数を取得します。public void Add(int item)
配列の末尾に新しい要素を追加します。private void Resize()
配列のサイズを拡張します。
クラスの詳細な動作
コンストラクター
public ListInt()
{
items = new int[4];
count = 0;
}
- 初期状態では、
items
配列を長さ 4 で作成します。 count
を 0 に設定し、配列に何も追加されていない状態を表します。
Add
メソッド
public void Add(int item)
{
if (count == items.Length)
{
Resize();
}
items[count] = item;
count++;
}
- 要素追加:
items
配列のcount
番目に新しい要素item
を追加します。count
をインクリメントして、要素数を更新します。
- 容量のチェック:
- 追加する際に、現在の配列が満杯 (
count == items.Length
) かどうかを確認します。 - 満杯であれば
Resize()
を呼び出して配列を拡張します。
- 追加する際に、現在の配列が満杯 (
Resize
メソッド
private void Resize()
{
int[] newArray = new int[items.Length * 2];
for (int i = 0; i < items.Length; i++)
{
newArray[i] = items[i];
}
items = newArray;
}
- 動作:
- 新しい配列
newArray
を、現在の配列の 2倍の長さ で作成します。 - 元の配列
items
の要素を、新しい配列newArray
にコピーします。 items
を新しい配列に置き換え、容量を拡張します。
- 新しい配列
- 目的:
配列のサイズは固定ですが、動的なリストのように動作させるため、配列のサイズを増やします。これにより、リストにより多くの要素を追加できます。
全体の動作
lines.Add(10)
:- 配列
items
に要素10
を追加。 count
が 1 になる。
- 配列
lines.Add(20)
:- 配列
items
に要素20
を追加。 count
が 2 になる。
- 配列
- 同様に 30, 40 を追加:
- どちらも現在の配列に収まり、
count
は 4 に到達。
- どちらも現在の配列に収まり、
lines.Add(50)
:count == items.Length
となるためResize()
を呼び出して配列の長さを 8 に拡張。- 新しい配列に既存の要素をコピーし、
50
を追加。
lines.Add(60)
:- 配列の空きがあるので、そのまま追加。
解説まとめ
ListInt
クラスは、動的に要素数が増えるリストを模倣しています。- 配列のサイズが不足した際に、自動でサイズを拡張することで、動的リストのような動作を可能にしています。
- 標準ライブラリの
List<int>
を使わず、自分でリストを設計することで、配列や動的メモリ管理の仕組みを学ぶ良い練習になります。
訪問数 7 回, 今日の訪問数 1回
ディスカッション
コメント一覧
まだ、コメントがありません