{ }codelper

学ぶ › C#

データ · 10

リストと配列

複数の値を一列に:個数、最初と最後、合計、すべて変換。

リスト(配列)は複数の値を順番に入れます。
下の例は数を読み込み、個数、最初と最後、合計を表示して、すべてを2倍にします。

using System;using System.Linq; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        int[] nums = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        Console.WriteLine(nums.Length);        Console.WriteLine($"{nums[0]} {nums[^1]}");        Console.WriteLine(nums.Sum());        int[] doubled = nums.Select(x => x * 2).ToArray();        Console.WriteLine(string.Join(" ", doubled));    }}
stdin
5
3 1 4 1 5
stdout
5
3 5
14
6 2 8 2 10

ポイント

  • 番号は 0 からです。
    だから最後の値は 個数 - 1 番です。
  • 大きさが決まった配列と、値を追加できるリストの二種類があります。
    名前と使い方は言語ごとに違います。
  • 合計・最大値は、最初から最後まで一度たどって求めます。
    「全部2倍」のような変換を1行で書ける言語もあります。
  • b = a はコピーではありません。
    同じリストにもう一つ名前を付けるだけなので、b に追加すると a も変わります(代入でコピーされるのは C++ の vector だけです)。
  • 範囲外を読むと、たいていの言語はエラーで止まります。
    止まらずにおかしな値を返す言語のほうが危険です。

言語ごとの書き方

Pythonlist — append、len(nums)、最後は nums[-1]。
sum・max があり、2倍は [x * 2 for x in nums]。
範囲外は IndexError
JavaScript配列 — push、length、最後は nums.at(-1)。
合計は reduce、最大値は Math.max(...nums)、変換は map。
範囲外はエラーなしで undefined
TypeScriptJavaScript と同じです。
number[] のように中身の型を書きます
Java固定の配列 int[] a = new int[n](a.length)、伸びる ArrayList<Integer>(add、size()、get(i))。
合計は Arrays.stream(a).sum() かループ。
範囲外は ArrayIndexOutOfBoundsException
C#固定の int[](Length)、伸びる List<int>(Add、Count)。
最後は nums[^1]。
LINQ Sum()・Max()・Average()・Select。
範囲外は IndexOutOfRangeException
C++std::vector<int> — push_back、size()、最後は back()。
合計は std::accumulate、最大値は std::max_element。
[] は範囲を確かめず、at(i) は例外を投げます
Cint a[1000] のように大きさを先に決め、個数は自分で別に持ちます。
合計・最大値・変換はすべてループ。
範囲外を読んでも何も言いません
Craykon[ ] — 追加、個数(1万個まで)、最後は nums[nums.個数 - 1]。
合計・最大値はループ。
範囲外は「リストには 0〜4 番しかありません」エラー

よくある間違い

最大値を 0 から始めた

nums = [-3, -1]
best = 0
for x in nums:
    if x > best: best = x
print(best)

→ 0 — 値がすべて負なので一度も変わりません(答えは -1)

最初の値 nums[0] から始めます。

平均が整数に切り捨てられたJava · C# · C · C++

int sum = 14, n = 5;
double avg = sum / n;

→ 2 — 14 / 5 が先に整数の割り算になります(2.8 ではありません)

割る前に変換します:(double)sum / n → 2.8。

範囲外を読んでも止まらないJavaScript · TypeScript · C · C++

const nums = [3, 1, 4];
console.log(nums[3]);
console.log(nums[-1]);

→ undefined が2回、エラーなし。C と C++ の [] は隣のメモリの値を何でも読みます

読む前に、番号が 0 から 個数 - 1 の中にあるか確かめます。

言語ごとの違い
リストを丸ごと表示すると言語ごとに形が違います:Python [3, 1, 4]、JavaScript [ 3, 1, 4 ]、Java の配列は [I@1b6d3586 のような名札、C# の配列は System.Int32[]。
空白区切りで出すには Python print(*nums)、JavaScript nums.join(" ")、C# string.Join(" ", nums)、Java はループを使い、Craykon の コンソール.書く(nums) はそのまま 3 1 4 と表示します。

練習問題