Re-translate the Japanese version (#1871)

* Retranslate Japanese docs with GPT-5.4

* Retranslate Japanese code with GPT-5.4
This commit is contained in:
Yudong Jin
2026-03-30 07:30:15 +08:00
committed by GitHub
parent fe6443235b
commit d7b2277d2b
1444 changed files with 83312 additions and 8363 deletions
+259 -131
View File
@@ -1,21 +1,21 @@
# リスト
<u>リスト</u>は、要素へのアクセス、更、追加、削除、走査などの操作をサポートする、順序付けられた要素のコレクションを表す抽象的なデータ構造の概念であり、ユーザーが容量制限を考慮する必要がありません。リストは連結リストまたは配列に基づいて実装できます
<u>リストlist</u>は抽象的なデータ構造の概念であり、要素の順序付き集合を表す。要素のアクセス、更、追加、削除、走査などの操作をサポートし、利用者は容量制限の問題を考慮する必要がない。リストは連結リストまたは配列に基づいて実装でき
- 連結リストは本質的にリストとして機能し、要素の追加削除、検索、変更の操作をサポートし、サイズを動的に調整する柔軟性があります
- 配列もこれらの操作をサポートしますが、長さが不変であるため、長さ制限のあるリストと考えることができます
- 連結リストは本質的にリストと見なすことができ、要素の追加削除・参照・更新をサポートし、柔軟に動的拡張できる
- 配列も要素の追加・削除・参照・更新をサポートすが、長さが不変であるため、長さ制限のあるリストとしか見なせない
配列を使用してリストを実装する場合、**長さ不変性によりリストの実用性が低下します**。これは、事前に格納するデータ量を予測することが困難な場合が多く、適切なリスト長を選択することが困難であるためです。長さが小さすぎると要件を満たない可能性があり、大きすぎるとメモリ空間を無駄にする可能性があります
配列リストを実装する場合、**長さ不変である性質によってリストの実用性が低下す**。これは、通常は事前にどれだけのデータを格納する必要があるかを決められず、適切なリスト長を選びにくいためである。長さが小さすぎると利用要件を満たない可能性が高く、大きすぎるとメモリ空間の浪費を招く
この問題を解決するために、<u>動的配列</u>を使用してリストを実装できます。これは配列の利点を継承し、プログラム実行中に動的拡張できます
この問題を解決するために、<u>動的配列dynamic array</u>を用いてリストを実装でき。これは配列の各種利点を引き継ぎつつ、プログラム実行中に動的拡張を行える
実際、**多くのプログラミング言語の標準ライブラリは動的配列を使用してリストを実装しています**。えば、Python`list`、Java`ArrayList`、C++`vector`、C#の`List`などで。以の議論では、「リスト」と「動的配列」を同義の概念として扱います
実際には、**多くのプログラミング言語の標準ライブラリが提供するリストは動的配列に基づいて実装されている**。たとえば、Python`list` 、Java`ArrayList` 、C++`vector` 、C# の `List` などである。以の議論では、「リスト」と「動的配列」を同概念として扱
## リストの一般的な操作
## リストの基本操作
### リストの初期化
通常「初期値なし」と「初期値あり」の2つの初期化方法を使用します
通常「初期値なし」と「初期値あり」の 2 つの初期化方法を用いる
=== "Python"
@@ -31,7 +31,7 @@
```cpp title="list.cpp"
/* リストを初期化 */
// 注意: C++ではvectorがここで説明されているnumsに相当しま
// なお、C++ では vector が本稿でいう nums に相当す
// 初期値なし
vector<int> nums1;
// 初期値あり
@@ -44,7 +44,7 @@
/* リストを初期化 */
// 初期値なし
List<Integer> nums1 = new ArrayList<>();
// 初期値あり(要素型はint[]のラッパークラスInteger[]である必要があります
// 初期値あり(配列の要素型は int[] のラッパークラスである Integer[] である必要があることに注意
Integer[] numbers = new Integer[] { 1, 3, 2, 5, 4 };
List<Integer> nums = new ArrayList<>(Arrays.asList(numbers));
```
@@ -123,133 +123,168 @@
=== "C"
```c title="list.c"
// Cは組み込みの動的配列を提供していません
// Cは組み込みの動的配列がない
```
=== "Kotlin"
```kotlin title="list.kt"
/* リストを初期化 */
// 初期値なし
var nums1 = listOf<Int>()
// 初期値あり
var numbers = arrayOf(1, 3, 2, 5, 4)
var nums = numbers.toMutableList()
```
=== "Ruby"
```ruby title="list.rb"
# リストを初期化
# 初期値なし
nums1 = []
# 初期値あり
nums = [1, 3, 2, 5, 4]
```
??? pythontutor "可視化実行"
https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%88%97%E8%A1%A8%0A%20%20%20%20%23%20%E6%97%A0%E5%88%9D%E5%A7%8B%E5%80%BC%0A%20%20%20%20nums1%20%3D%20%5B%5D%0A%20%20%20%20%23%20%E6%9C%89%E5%88%9D%E5%A7%8B%E5%80%BC%0A%20%20%20%20nums%20%3D%20%5B1,%203,%202,%205,%204%5D&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false
### 要素へのアクセス
リスト本質的に配列であるため、$O(1)$時間で要素にアクセスし更新することができ、非常に効率的です
リスト本質配列であるため、要素へのアクセスと更新は $O(1)$ 時間で行え、効率が高い
=== "Python"
```python title="list.py"
# 要素にアクセス
num: int = nums[1] # インデックス1の要素にアクセス
num: int = nums[1] # インデックス 1 の要素にアクセス
# 要素を更新
nums[1] = 0 # インデックス1の要素を0に更新
nums[1] = 0 # インデックス 1 の要素を 0 に更新
```
=== "C++"
```cpp title="list.cpp"
/* 要素にアクセス */
int num = nums[1]; // インデックス1の要素にアクセス
int num = nums[1]; // インデックス 1 の要素にアクセス
/* 要素を更新 */
nums[1] = 0; // インデックス1の要素を0に更新
nums[1] = 0; // インデックス 1 の要素を 0 に更新
```
=== "Java"
```java title="list.java"
/* 要素にアクセス */
int num = nums.get(1); // インデックス1の要素にアクセス
int num = nums.get(1); // インデックス 1 の要素にアクセス
/* 要素を更新 */
nums.set(1, 0); // インデックス1の要素を0に更新
nums.set(1, 0); // インデックス 1 の要素を 0 に更新
```
=== "C#"
```csharp title="list.cs"
/* 要素にアクセス */
int num = nums[1]; // インデックス1の要素にアクセス
int num = nums[1]; // インデックス 1 の要素にアクセス
/* 要素を更新 */
nums[1] = 0; // インデックス1の要素を0に更新
nums[1] = 0; // インデックス 1 の要素を 0 に更新
```
=== "Go"
```go title="list_test.go"
/* 要素にアクセス */
num := nums[1] // インデックス1の要素にアクセス
num := nums[1] // インデックス 1 の要素にアクセス
/* 要素を更新 */
nums[1] = 0 // インデックス1の要素を0に更新
nums[1] = 0 // インデックス 1 の要素を 0 に更新
```
=== "Swift"
```swift title="list.swift"
/* 要素にアクセス */
let num = nums[1] // インデックス1の要素にアクセス
let num = nums[1] // インデックス 1 の要素にアクセス
/* 要素を更新 */
nums[1] = 0 // インデックス1の要素を0に更新
nums[1] = 0 // インデックス 1 の要素を 0 に更新
```
=== "JS"
```javascript title="list.js"
/* 要素にアクセス */
const num = nums[1]; // インデックス1の要素にアクセス
const num = nums[1]; // インデックス 1 の要素にアクセス
/* 要素を更新 */
nums[1] = 0; // インデックス1の要素を0に更新
nums[1] = 0; // インデックス 1 の要素を 0 に更新
```
=== "TS"
```typescript title="list.ts"
/* 要素にアクセス */
const num: number = nums[1]; // インデックス1の要素にアクセス
const num: number = nums[1]; // インデックス 1 の要素にアクセス
/* 要素を更新 */
nums[1] = 0; // インデックス1の要素を0に更新
nums[1] = 0; // インデックス 1 の要素を 0 に更新
```
=== "Dart"
```dart title="list.dart"
/* 要素にアクセス */
int num = nums[1]; // インデックス1の要素にアクセス
int num = nums[1]; // インデックス 1 の要素にアクセス
/* 要素を更新 */
nums[1] = 0; // インデックス1の要素を0に更新
nums[1] = 0; // インデックス 1 の要素を 0 に更新
```
=== "Rust"
```rust title="list.rs"
/* 要素にアクセス */
let num: i32 = nums[1]; // インデックス1の要素にアクセス
let num: i32 = nums[1]; // インデックス 1 の要素にアクセス
/* 要素を更新 */
nums[1] = 0; // インデックス1の要素を0に更新
nums[1] = 0; // インデックス 1 の要素を 0 に更新
```
=== "C"
```c title="list.c"
// Cは組み込みの動的配列を提供していません
// Cは組み込みの動的配列がない
```
=== "Kotlin"
```kotlin title="list.kt"
/* 要素にアクセス */
val num = nums[1] // インデックス 1 の要素にアクセス
/* 要素を更新 */
nums[1] = 0 // インデックス 1 の要素を 0 に更新
```
=== "Ruby"
```ruby title="list.rb"
# 要素にアクセス
num = nums[1] # インデックス 1 の要素にアクセス
# 要素を更新
nums[1] = 0 # インデックス 1 の要素を 0 に更新
```
??? pythontutor "可視化実行"
https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%88%97%E8%A1%A8%0A%20%20%20%20nums%20%3D%20%5B1,%203,%202,%205,%204%5D%0A%0A%20%20%20%20%23%20%E8%AE%BF%E9%97%AE%E5%85%83%E7%B4%A0%0A%20%20%20%20num%20%3D%20nums%5B1%5D%20%20%23%20%E8%AE%BF%E9%97%AE%E7%B4%A2%E5%BC%95%201%20%E5%A4%84%E7%9A%84%E5%85%83%E7%B4%A0%0A%0A%20%20%20%20%23%20%E6%9B%B4%E6%96%B0%E5%85%83%E7%B4%A0%0A%20%20%20%20nums%5B1%5D%20%3D%200%20%20%20%20%23%20%E5%B0%86%E7%B4%A2%E5%BC%95%201%20%E5%A4%84%E7%9A%84%E5%85%83%E7%B4%A0%E6%9B%B4%E6%96%B0%E4%B8%BA%200&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false
### 要素の挿入と削除
配列と比較して、リストは要素追加削除においてより柔軟性を提供します。リスト末尾への要素追加は$O(1)$操作ですが、リストの他の場所での要素の挿入と削除の効率は配列と同じままで、時間計算量は$O(n)$です
配列と比て、リストは要素を自由に追加削除できる。リスト末尾への要素追加の時間計算量は $O(1)$ だが、要素の挿入と削除の効率は依然として配列と同じで、時間計算量は $O(n)$ である
=== "Python"
@@ -264,11 +299,11 @@
nums.append(5)
nums.append(4)
# 中に要素を挿入
nums.insert(3, 6) # インデックス3に数値6を挿入
# 中に要素を挿入
nums.insert(3, 6) # インデックス 3 に数値 6 を挿入
# 要素を削除
nums.pop(3) # インデックス3の要素を削除
nums.pop(3) # インデックス 3 の要素を削除
```
=== "C++"
@@ -284,11 +319,11 @@
nums.push_back(5);
nums.push_back(4);
/* 中に要素を挿入 */
nums.insert(nums.begin() + 3, 6); // インデックス3に数値6を挿入
/* 中に要素を挿入 */
nums.insert(nums.begin() + 3, 6); // インデックス 3 に数値 6 を挿入
/* 要素を削除 */
nums.erase(nums.begin() + 3); // インデックス3の要素を削除
nums.erase(nums.begin() + 3); // インデックス 3 の要素を削除
```
=== "Java"
@@ -304,11 +339,11 @@
nums.add(5);
nums.add(4);
/* 中に要素を挿入 */
nums.add(3, 6); // インデックス3に数値6を挿入
/* 中に要素を挿入 */
nums.add(3, 6); // インデックス 3 に数値 6 を挿入
/* 要素を削除 */
nums.remove(3); // インデックス3の要素を削除
nums.remove(3); // インデックス 3 の要素を削除
```
=== "C#"
@@ -324,11 +359,11 @@
nums.Add(5);
nums.Add(4);
/* 中に要素を挿入 */
nums.Insert(3, 6);
/* 中に要素を挿入 */
nums.Insert(3, 6); // インデックス 3 に数値 6 を挿入
/* 要素を削除 */
nums.RemoveAt(3);
nums.RemoveAt(3); // インデックス 3 の要素を削除
```
=== "Go"
@@ -344,11 +379,11 @@
nums = append(nums, 5)
nums = append(nums, 4)
/* 中に要素を挿入 */
nums = append(nums[:3], append([]int{6}, nums[3:]...)...) // インデックス3に数値6を挿入
/* 中に要素を挿入 */
nums = append(nums[:3], append([]int{6}, nums[3:]...)...) // インデックス 3 に数値 6 を挿入
/* 要素を削除 */
nums = append(nums[:3], nums[4:]...) // インデックス3の要素を削除
nums = append(nums[:3], nums[4:]...) // インデックス 3 の要素を削除
```
=== "Swift"
@@ -364,11 +399,11 @@
nums.append(5)
nums.append(4)
/* 中に要素を挿入 */
nums.insert(6, at: 3) // インデックス3に数値6を挿入
/* 中に要素を挿入 */
nums.insert(6, at: 3) // インデックス 3 に数値 6 を挿入
/* 要素を削除 */
nums.remove(at: 3) // インデックス3の要素を削除
nums.remove(at: 3) // インデックス 3 の要素を削除
```
=== "JS"
@@ -384,11 +419,11 @@
nums.push(5);
nums.push(4);
/* 中に要素を挿入 */
nums.splice(3, 0, 6);
/* 中に要素を挿入 */
nums.splice(3, 0, 6); // インデックス 3 に数値 6 を挿入
/* 要素を削除 */
nums.splice(3, 1);
nums.splice(3, 1); // インデックス 3 の要素を削除
```
=== "TS"
@@ -404,11 +439,11 @@
nums.push(5);
nums.push(4);
/* 中に要素を挿入 */
nums.splice(3, 0, 6);
/* 中に要素を挿入 */
nums.splice(3, 0, 6); // インデックス 3 に数値 6 を挿入
/* 要素を削除 */
nums.splice(3, 1);
nums.splice(3, 1); // インデックス 3 の要素を削除
```
=== "Dart"
@@ -424,11 +459,11 @@
nums.add(5);
nums.add(4);
/* 中に要素を挿入 */
nums.insert(3, 6); // インデックス3に数値6を挿入
/* 中に要素を挿入 */
nums.insert(3, 6); // インデックス 3 に数値 6 を挿入
/* 要素を削除 */
nums.removeAt(3); // インデックス3の要素を削除
nums.removeAt(3); // インデックス 3 の要素を削除
```
=== "Rust"
@@ -444,38 +479,76 @@
nums.push(5);
nums.push(4);
/* 中に要素を挿入 */
nums.insert(3, 6); // インデックス3に数値6を挿入
/* 中に要素を挿入 */
nums.insert(3, 6); // インデックス 3 に数値 6 を挿入
/* 要素を削除 */
nums.remove(3); // インデックス3の要素を削除
nums.remove(3); // インデックス 3 の要素を削除
```
=== "C"
```c title="list.c"
// Cは組み込みの動的配列を提供していません
// Cは組み込みの動的配列がない
```
=== "Kotlin"
```kotlin title="list.kt"
/* リストをクリア */
nums.clear();
/* 末尾に要素を追加 */
nums.add(1);
nums.add(3);
nums.add(2);
nums.add(5);
nums.add(4);
/* 途中に要素を挿入 */
nums.add(3, 6); // インデックス 3 に数値 6 を挿入
/* 要素を削除 */
nums.remove(3); // インデックス 3 の要素を削除
```
### リストの反復
=== "Ruby"
配列と同様に、リストはインデックスを使用して反復することも、各要素を直接反復することもできます。
```ruby title="list.rb"
# リストをクリア
nums.clear
# 末尾に要素を追加
nums << 1
nums << 3
nums << 2
nums << 5
nums << 4
# 途中に要素を挿入
nums.insert(3, 6) # インデックス 3 に数値 6 を挿入
# 要素を削除
nums.delete_at(3) # インデックス 3 の要素を削除
```
??? pythontutor "可視化実行"
https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E6%9C%89%E5%88%9D%E5%A7%8B%E5%80%BC%0A%20%20%20%20nums%20%3D%20%5B1,%203,%202,%205,%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%E6%B8%85%E7%A9%BA%E5%88%97%E8%A1%A8%0A%20%20%20%20nums.clear%28%29%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%9C%A8%E5%B0%BE%E9%83%A8%E6%B7%BB%E5%8A%A0%E5%85%83%E7%B4%A0%0A%20%20%20%20nums.append%281%29%0A%20%20%20%20nums.append%283%29%0A%20%20%20%20nums.append%282%29%0A%20%20%20%20nums.append%285%29%0A%20%20%20%20nums.append%284%29%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%9C%A8%E4%B8%AD%E9%97%B4%E6%8F%92%E5%85%A5%E5%85%83%E7%B4%A0%0A%20%20%20%20nums.insert%283,%206%29%20%20%23%20%E5%9C%A8%E7%B4%A2%E5%BC%95%203%20%E5%A4%84%E6%8F%92%E5%85%A5%E6%95%B0%E5%AD%97%206%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%88%A0%E9%99%A4%E5%85%83%E7%B4%A0%0A%20%20%20%20nums.pop%283%29%20%20%20%20%20%20%20%20%23%20%E5%88%A0%E9%99%A4%E7%B4%A2%E5%BC%95%203%20%E5%A4%84%E7%9A%84%E5%85%83%E7%B4%A0&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false
### リストの走査
配列と同様に、リストもインデックスに基づいて走査することも、各要素を直接走査することもできる。
=== "Python"
```python title="list.py"
# インデックスでリストを反復
# インデックスでリストを走査
count = 0
for i in range(len(nums)):
count += nums[i]
# リスト要素を直接反復
# リスト要素を直接走査
for num in nums:
count += num
```
@@ -483,13 +556,13 @@
=== "C++"
```cpp title="list.cpp"
/* インデックスでリストを反復 */
/* インデックスでリストを走査 */
int count = 0;
for (int i = 0; i < nums.size(); i++) {
count += nums[i];
}
/* リスト要素を直接反復 */
/* リスト要素を直接走査 */
count = 0;
for (int num : nums) {
count += num;
@@ -499,13 +572,13 @@
=== "Java"
```java title="list.java"
/* インデックスでリストを反復 */
/* インデックスでリストを走査 */
int count = 0;
for (int i = 0; i < nums.size(); i++) {
count += nums.get(i);
}
/* リスト要素を直接反復 */
/* リスト要素を直接走査 */
for (int num : nums) {
count += num;
}
@@ -514,13 +587,13 @@
=== "C#"
```csharp title="list.cs"
/* インデックスでリストを反復 */
/* インデックスでリストを走査 */
int count = 0;
for (int i = 0; i < nums.Count; i++) {
count += nums[i];
}
/* リスト要素を直接反復 */
/* リスト要素を直接走査 */
count = 0;
foreach (int num in nums) {
count += num;
@@ -530,13 +603,13 @@
=== "Go"
```go title="list_test.go"
/* インデックスでリストを反復 */
/* インデックスでリストを走査 */
count := 0
for i := 0; i < len(nums); i++ {
count += nums[i]
}
/* リスト要素を直接反復 */
/* リスト要素を直接走査 */
count = 0
for _, num := range nums {
count += num
@@ -546,13 +619,13 @@
=== "Swift"
```swift title="list.swift"
/* インデックスでリストを反復 */
/* インデックスでリストを走査 */
var count = 0
for i in nums.indices {
count += nums[i]
}
/* リスト要素を直接反復 */
/* リスト要素を直接走査 */
count = 0
for num in nums {
count += num
@@ -562,13 +635,13 @@
=== "JS"
```javascript title="list.js"
/* インデックスでリストを反復 */
/* インデックスでリストを走査 */
let count = 0;
for (let i = 0; i < nums.length; i++) {
count += nums[i];
}
/* リスト要素を直接反復 */
/* リスト要素を直接走査 */
count = 0;
for (const num of nums) {
count += num;
@@ -578,13 +651,13 @@
=== "TS"
```typescript title="list.ts"
/* インデックスでリストを反復 */
/* インデックスでリストを走査 */
let count = 0;
for (let i = 0; i < nums.length; i++) {
count += nums[i];
}
/* リスト要素を直接反復 */
/* リスト要素を直接走査 */
count = 0;
for (const num of nums) {
count += num;
@@ -594,13 +667,13 @@
=== "Dart"
```dart title="list.dart"
/* インデックスでリストを反復 */
/* インデックスでリストを走査 */
int count = 0;
for (var i = 0; i < nums.length; i++) {
count += nums[i];
}
/* リスト要素を直接反復 */
/* リスト要素を直接走査 */
count = 0;
for (var num in nums) {
count += num;
@@ -610,13 +683,13 @@
=== "Rust"
```rust title="list.rs"
// インデックスでリストを反復
// インデックスでリストを走査
let mut _count = 0;
for i in 0..nums.len() {
_count += nums[i];
}
// リスト要素を直接反復
// リスト要素を直接走査
_count = 0;
for num in &nums {
_count += num;
@@ -626,96 +699,125 @@
=== "C"
```c title="list.c"
// Cは組み込みの動的配列を提供していません
// Cは組み込みの動的配列がない
```
=== "Kotlin"
```kotlin title="list.kt"
/* インデックスでリストを走査 */
var count = 0
for (i in nums.indices) {
count += nums[i]
}
/* リストの要素を直接走査 */
for (num in nums) {
count += num
}
```
=== "Ruby"
```ruby title="list.rb"
# インデックスでリストを走査
count = 0
for i in 0...nums.length
count += nums[i]
end
# リストの要素を直接走査
count = 0
for num in nums
count += num
end
```
??? pythontutor "可視化実行"
https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%88%97%E8%A1%A8%0A%20%20%20%20nums%20%3D%20%5B1,%203,%202,%205,%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%E9%80%9A%E8%BF%87%E7%B4%A2%E5%BC%95%E9%81%8D%E5%8E%86%E5%88%97%E8%A1%A8%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20nums%5Bi%5D%0A%0A%20%20%20%20%23%20%E7%9B%B4%E6%8E%A5%E9%81%8D%E5%8E%86%E5%88%97%E8%A1%A8%E5%85%83%E7%B4%A0%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20num&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false
### リストの連結
新しいリスト`nums1`が与えられたとき、それを元のリストの末尾に追加できます
新しいリスト `nums1` が与えられたとき、それを元のリストの末尾に連結できる
=== "Python"
```python title="list.py"
# 2つのリストを連結
# 2 つのリストを連結
nums1: list[int] = [6, 8, 7, 10, 9]
nums += nums1 # nums1numsの末尾に連結
nums += nums1 # リスト nums1nums の後ろに連結
```
=== "C++"
```cpp title="list.cpp"
/* 2つのリストを連結 */
/* 2 つのリストを連結 */
vector<int> nums1 = { 6, 8, 7, 10, 9 };
// nums1numsの末尾に連結
// リスト nums1nums の後ろに連結
nums.insert(nums.end(), nums1.begin(), nums1.end());
```
=== "Java"
```java title="list.java"
/* 2つのリストを連結 */
/* 2 つのリストを連結 */
List<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));
nums.addAll(nums1); // nums1numsの末尾に連結
nums.addAll(nums1); // リスト nums1nums の後ろに連結
```
=== "C#"
```csharp title="list.cs"
/* 2つのリストを連結 */
/* 2 つのリストを連結 */
List<int> nums1 = [6, 8, 7, 10, 9];
nums.AddRange(nums1); // nums1numsの末尾に連結
nums.AddRange(nums1); // リスト nums1nums の後ろに連結
```
=== "Go"
```go title="list_test.go"
/* 2つのリストを連結 */
/* 2 つのリストを連結 */
nums1 := []int{6, 8, 7, 10, 9}
nums = append(nums, nums1...) // nums1numsの末尾に連結
nums = append(nums, nums1...) // リスト nums1nums の後ろに連結
```
=== "Swift"
```swift title="list.swift"
/* 2つのリストを連結 */
/* 2 つのリストを連結 */
let nums1 = [6, 8, 7, 10, 9]
nums.append(contentsOf: nums1) // nums1numsの末尾に連結
nums.append(contentsOf: nums1) // リスト nums1nums の後ろに連結
```
=== "JS"
```javascript title="list.js"
/* 2つのリストを連結 */
/* 2 つのリストを連結 */
const nums1 = [6, 8, 7, 10, 9];
nums.push(...nums1); // nums1numsの末尾に連結
nums.push(...nums1); // リスト nums1nums の後ろに連結
```
=== "TS"
```typescript title="list.ts"
/* 2つのリストを連結 */
/* 2 つのリストを連結 */
const nums1: number[] = [6, 8, 7, 10, 9];
nums.push(...nums1); // nums1numsの末尾に連結
nums.push(...nums1); // リスト nums1nums の後ろに連結
```
=== "Dart"
```dart title="list.dart"
/* 2つのリストを連結 */
/* 2 つのリストを連結 */
List<int> nums1 = [6, 8, 7, 10, 9];
nums.addAll(nums1); // nums1numsの末尾に連結
nums.addAll(nums1); // リスト nums1nums の後ろに連結
```
=== "Rust"
```rust title="list.rs"
/* 2つのリストを連結 */
/* 2 つのリストを連結 */
let nums1: Vec<i32> = vec![6, 8, 7, 10, 9];
nums.extend(nums1);
```
@@ -723,110 +825,136 @@
=== "C"
```c title="list.c"
// Cは組み込みの動的配列を提供していません
// Cは組み込みの動的配列がない
```
=== "Kotlin"
```kotlin title="list.kt"
/* 2 つのリストを連結 */
val nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()
nums.addAll(nums1) // リスト nums1 を nums の後ろに連結
```
### リストのソート
=== "Ruby"
リストがソートされると、「二分探索」や「双ポインタ」アルゴリズムなど、配列関連のアルゴリズム問題でよく使用されるアルゴリズムを使用できます。
```ruby title="list.rb"
# 2 つのリストを連結
nums1 = [6, 8, 7, 10, 9]
nums += nums1
```
??? pythontutor "可視化実行"
https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%88%97%E8%A1%A8%0A%20%20%20%20nums%20%3D%20%5B1,%203,%202,%205,%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%E6%8B%BC%E6%8E%A5%E4%B8%A4%E4%B8%AA%E5%88%97%E8%A1%A8%0A%20%20%20%20nums1%20%3D%20%5B6,%208,%207,%2010,%209%5D%0A%20%20%20%20nums%20%2B%3D%20nums1%20%20%23%20%E5%B0%86%E5%88%97%E8%A1%A8%20nums1%20%E6%8B%BC%E6%8E%A5%E5%88%B0%20nums%20%E4%B9%8B%E5%90%8E&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false
### リストをソート
リストのソートが完了すると、配列系アルゴリズム問題でよく問われる「二分探索」や「両ポインタ」アルゴリズムを使えるようになる。
=== "Python"
```python title="list.py"
# リストをソート
nums.sort() # ソート後、リスト要素は昇順になります
nums.sort() # ソート後、リスト要素は小さい順に並ぶ
```
=== "C++"
```cpp title="list.cpp"
/* リストをソート */
sort(nums.begin(), nums.end()); // ソート後、リスト要素は昇順になります
sort(nums.begin(), nums.end()); // ソート後、リスト要素は小さい順に並ぶ
```
=== "Java"
```java title="list.java"
/* リストをソート */
Collections.sort(nums); // ソート後、リスト要素は昇順になります
Collections.sort(nums); // ソート後、リスト要素は小さい順に並ぶ
```
=== "C#"
```csharp title="list.cs"
/* リストをソート */
nums.Sort(); // ソート後、リスト要素は昇順になります
nums.Sort(); // ソート後、リスト要素は小さい順に並ぶ
```
=== "Go"
```go title="list_test.go"
/* リストをソート */
sort.Ints(nums) // ソート後、リスト要素は昇順になります
sort.Ints(nums) // ソート後、リスト要素は小さい順に並ぶ
```
=== "Swift"
```swift title="list.swift"
/* リストをソート */
nums.sort() // ソート後、リスト要素は昇順になります
nums.sort() // ソート後、リスト要素は小さい順に並ぶ
```
=== "JS"
```javascript title="list.js"
/* リストをソート */
nums.sort((a, b) => a - b); // ソート後、リスト要素は昇順になります
nums.sort((a, b) => a - b); // ソート後、リスト要素は小さい順に並ぶ
```
=== "TS"
```typescript title="list.ts"
/* リストをソート */
nums.sort((a, b) => a - b); // ソート後、リスト要素は昇順になります
nums.sort((a, b) => a - b); // ソート後、リスト要素は小さい順に並ぶ
```
=== "Dart"
```dart title="list.dart"
/* リストをソート */
nums.sort(); // ソート後、リスト要素は昇順になります
nums.sort(); // ソート後、リスト要素は小さい順に並ぶ
```
=== "Rust"
```rust title="list.rs"
/* リストをソート */
nums.sort(); // ソート後、リスト要素は昇順になります
nums.sort(); // ソート後、リスト要素は小さい順に並ぶ
```
=== "C"
```c title="list.c"
// Cは組み込みの動的配列を提供していません
// Cは組み込みの動的配列がない
```
=== "Kotlin"
```kotlin title="list.kt"
/* リストをソート */
nums.sort() // ソート後、リスト要素は小さい順に並ぶ
```
=== "Ruby"
```ruby title="list.rb"
# リストをソート
nums = nums.sort { |a, b| a <=> b } # ソート後、リスト要素は小さい順に並ぶ
```
??? pythontutor "可視化実行"
https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%88%97%E8%A1%A8%0A%20%20%20%20nums%20%3D%20%5B1,%203,%202,%205,%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%E6%8E%92%E5%BA%8F%E5%88%97%E8%A1%A8%0A%20%20%20%20nums.sort%28%29%20%20%23%20%E6%8E%92%E5%BA%8F%E5%90%8E%EF%BC%8C%E5%88%97%E8%A1%A8%E5%85%83%E7%B4%A0%E4%BB%8E%E5%B0%8F%E5%88%B0%E5%A4%A7%E6%8E%92%E5%88%97&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false
## リストの実装
多くのプログラミング言語にはJava、C++、Pythonなどを含む組み込みリストが付属しています。それらの実装は、初期容量や拡張係数などの様々なパラメータを慎重に考慮した設定で、複雑になりがちです。興味のある読者は、さらなる学習のためにソースコードを調べることができます
多くのプログラミング言語にはリストが組み込まれており、たとえば Java、C++、Python などがある。それらの実装は比較的複雑で、初期容量や拡張倍率など各種パラメータの設定もよく考えられている。興味があればソースコードを参照して学べる
リストがどのように動作するかの理解を深めるために、3つの重要な設計側面に焦点を当てて、簡略化されたリストの実装を試みます:
リストの動作原理への理解を深めるため、ここでは簡易版のリストを実装し、以下の 3 つの設計ポイントを含める。
- **初期容量**配列に合理的な初期容量を選択します。この例では初期容量として10を選択します
- **サイズ記録**リスト内の現在の要素数を記録する変数`size`を宣言し、要素の挿入と削除リアルタイムに更新します。この変数により、リスト末尾を特定し、拡張が必要かどうかを判断できます
- **拡張メカニズム**:要素挿入時にリストが満杯に達した場合、拡張プロセスが必要です。これには拡張係数に基づいてより大きな配列を作成し、現在の配列からすべての要素を新しい配列に転送することが含まれます。この例では、拡張のたびに配列サイズを2倍にすることを規定します
- **初期容量**妥当な配列の初期容量を選。この例では 10 を初期容量として選ぶ
- **要素数の記録**`size` という変数を宣言して、現在のリスト要素数を記録し、要素の挿入と削除に応じてリアルタイムに更新す。この変数により、リスト末尾の位置を特定し、拡張が必要かどうかを判断でき
- **拡張機構**:要素挿入する時点でリスト容量がいっぱいなら、拡張が必要になる。まず拡張倍率に応じてより大きな配列を作成し、次に現在の配列の要素を順に新しい配列へ移す。この例では、配列を毎回以前の 2 倍に拡張する
```src
[file]{my_list}-[class]{my_list}-[func]{}