学ぶ › JavaScript
データ · 10
リストと配列
複数の値を一列に:個数、最初と最後、合計、すべて変換。
リスト(配列)は複数の値を順番に入れます。
下の例は数を読み込み、個数、最初と最後、合計を表示して、すべてを2倍にします。
n = int(input())nums = list(map(int, input().split()))print(len(nums))print(nums[0], nums[-1])print(sum(nums))doubled = [x * 2 for x in nums]print(*doubled)const [n, ...nums] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);console.log(nums.length);console.log(nums[0], nums[nums.length - 1]);console.log(nums.reduce((a, b) => a + b, 0));const doubled = nums.map((x) => x * 2);console.log(doubled.join(" "));import { readFileSync } from "node:fs";const [n, ...nums]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);console.log(nums.length);console.log(nums[0], nums[nums.length - 1]);console.log(nums.reduce((a, b) => a + b, 0));const doubled: number[] = nums.map((x) => x * 2);console.log(doubled.join(" "));import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] nums = new int[n]; for (int i = 0; i < n; i++) nums[i] = sc.nextInt(); System.out.println(nums.length); System.out.println(nums[0] + " " + nums[n - 1]); int sum = 0; for (int x : nums) sum += x; System.out.println(sum); StringBuilder doubled = new StringBuilder(); for (int i = 0; i < n; i++) doubled.append(i > 0 ? " " : "").append(nums[i] * 2); System.out.println(doubled); }}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)); }}#include <iostream>#include <numeric>#include <vector> int main() { int n; std::cin >> n; std::vector<int> nums(n); for (int& x : nums) std::cin >> x; std::cout << nums.size() << '\n'; std::cout << nums.front() << ' ' << nums.back() << '\n'; std::cout << std::accumulate(nums.begin(), nums.end(), 0) << '\n'; for (int i = 0; i < n; i++) std::cout << (i > 0 ? " " : "") << nums[i] * 2; std::cout << '\n';}#include <stdio.h> int main(void) { int n, nums[1000], sum = 0; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &nums[i]); printf("%d\n", n); printf("%d %d\n", nums[0], nums[n - 1]); for (int i = 0; i < n; i++) sum += nums[i]; printf("%d\n", sum); for (int i = 0; i < n; i++) printf(i > 0 ? " %d" : "%d", nums[i] * 2); printf("\n"); return 0;}n = コンソール.行読み().数に();nums = コンソール.数読み();コンソール.書く(nums.個数);コンソール.書く(nums[0] + " " + nums[nums.個数 - 1]);total = 0;doubled = [];それぞれ (x の中 nums){ total += x; doubled.追加(x * 2);}コンソール.書く(total);コンソール.書く(doubled);5 3 1 4 1 5
5 3 5 14 6 2 8 2 10
ポイント
- 番号は 0 からです。
だから最後の値は個数 - 1番です。 - 大きさが決まった配列と、値を追加できるリストの二種類があります。
名前と使い方は言語ごとに違います。 - 合計・最大値は、最初から最後まで一度たどって求めます。
「全部2倍」のような変換を1行で書ける言語もあります。 b = aはコピーではありません。
同じリストにもう一つ名前を付けるだけなので、bに追加するとaも変わります(代入でコピーされるのは C++ のvectorだけです)。- 範囲外を読むと、たいていの言語はエラーで止まります。
止まらずにおかしな値を返す言語のほうが危険です。
言語ごとの書き方
| Python | list — 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 |
| TypeScript | JavaScript と同じです。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) は例外を投げます |
| C | int 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] から始めます。
範囲外を読んでも止まらないJavaScript · TypeScript · C · C++
const nums = [3, 1, 4];
console.log(nums[3]);
console.log(nums[-1]);→ undefined が2回、エラーなし。C と C++ の [] は隣のメモリの値を何でも読みます
読む前に、番号が 0 から 個数 - 1 の中にあるか確かめます。
平均が整数に切り捨てられたJava · C# · C · C++
int sum = 14, n = 5;
double avg = sum / n;→ 2 — 14 / 5 が先に整数の割り算になります(2.8 ではありません)
割る前に変換します:(double)sum / n → 2.8。
言語ごとの違い
リストを丸ごと表示すると言語ごとに形が違います:Python
空白区切りで出すには Python
リストを丸ごと表示すると言語ごとに形が違います: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 と表示します。