データがある限り標準入力から読み込む。(C#、Java、JavaScript、PHP、Python3、Ruby比較)

 paizaの演習問題などでは、標準入力から読み込んだデータを設問に従って処理していくコードを書いて解答します。

 読み込む行数が別途与えられていることが多いですが、中には読み込む行数が与えられておらず、データがある限り読み込む必要がある出題も存在します。

 今回は標準入力されたデータが存在する行を全て読み込んでいく方法について、C#、Java、JavaScript、PHP、Python3、Rubyの6言語で比較します。

 標準入力されたデータの全行を読み込んで配列(リスト)に格納し、その配列(リスト)の中身を出力させます。

C#
using System;
using System.Linq;
using System.Collections.Generic;

public class Sample{
    //リストの全要素をカンマ区切りで出力する
    public static void listOutput(List<string> list){
        int idx = 0;
        Console.Write("[");

        foreach (var x in list){
            Console.Write(x);
            if (idx < list.Count-1){
                Console.Write(", ");
            } else {
                Console.WriteLine("]");
            }
            idx += 1;
        }
    }

    public static void Main(){
        //入力データがある限り読み込んでリストに入れる
        var boxList = new List<string>();
        string line = "";

        while ((line = Console.ReadLine()) != null ){
            boxList.Add(line);
        }
        
        listOutput(boxList);
    }
}

 読み込んだデータを1つづつ追加していくことから、要素を可変長で格納できるリストを使用します。リストを使用可能にするため、予めSystem.Collections.Genericモジュールを読み込んでおきます。

 while ((line = Console.ReadLine()) != null)を使って、標準入力にデータが存在する行がある限り読み込みます。読み込んだデータは、while文の繰返し処理の中で、リストboxListに1つづつ格納していきます。

 リストへの追加が終わったら、foreach文を使ってリスト内に格納されたデータを1つづつ取り出し、カンマ区切りで表示させます。

Java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        //入力データがある限り読み込んでリストに入れる
        Scanner scan = new Scanner(System.in);

        ArrayList<String> boxList = new ArrayList<String>();

        while (scan.hasNextLine()) {
            String line = scan.nextLine();
            boxList.add(line);
        }

        //リストの中身を出力
        System.out.println(boxList);
    }
}

 読み込んだデータを1つづつ追加していくことから、要素を可変長で格納できるリストを使用します。

 while (scan.hasNextLine())を使って、標準入力にデータが存在する行がある限り読み込みます。読み込んだデータは、while文の繰返し処理の中で、リストboxListに1つづつ格納していきます。

 リストへの追加が終わったら、拡張for文を使ってリスト内に格納されたデータを1つづつ取り出し、カンマ区切りで表示させます。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

reader.on('line', (line) => {
    lines.push(line);
});

reader.on('close', () => {
    //入力データがある限り読み込んで配列に入れる
    var arr = [];
    for (var x of lines){
        arr.push(x);
    }

    //配列の中身を出力
    console.log(arr);
});

 JavaScriptでは、標準入力されたデータは全部配列linesの中に格納されています。配列linesの内容をfor of文を用いて、配列arrに1つづつ入れていきます。

 データが格納された配列arrの内容は、console.logで表示できます。

PHP
<?php
//配列の内容をカンマ区切りで出力。
function arroutput($arr){
    $ln = count($arr);
    $idx = 0;
    echo "[";
    
    foreach ($arr as $x){
        echo $x;

        if ($idx < ($ln - 1)){
            echo ", ";
        } else {
            echo "]"."\n";
        }
        $idx += 1;
    }
}

//入力データがある限り読み込んで配列に入れる
$arrBox = [];

while ($line = fgets(STDIN)){
    $x = trim($line);
    array_push($arrBox,$x);
}

//配列の中身を出力
arroutput($arrBox);

?>

 while ($line = fgets(STDIN))で、標準入力にデータが存在する行がある限り読み込みます。読み込んだデータは、while文の繰返し処理の中で、配列$arrBoxに1つづつ格納していきます。

 なお、ここで0を読み込むとwhile文がfalseになって処理が終わってしまうので、while文では改行区切りも一緒に読み込みます。改行区切りは、別の変数に入れる所で除去します。

 データを配列に入れ終わったら、foreach文を使って配列$arrBoxに格納されたデータを1つづつ取り出し、カンマ区切りで表示させます。

Python3
import fileinput
#入力データがある限り読み込んで配列に入れる
arrBox=[]
for x in fileinput.input():
    line = x.rstrip()
    arrBox.append(line)

#配列の中身を出力
print(arrBox)

 for x in fileinput.input():を使って、データが存在する行を全て読み込みます。この文を使うには、import fileinputで、fileinputモジュールを予め読み込んでおく必要があります。読み込んだデータは、for文の繰り返し処理の中で、配列arrBoxに格納。

 データが格納された配列arrBoxの内容は、print(arrBox)で表示できます。

Ruby
#入力データがある限り読み込んで配列に入れる
arrBox = []
while line = gets
    arrBox.push(line.chomp)
end

#配列の中身を出力
p arrBox

 while line = getsで、データが存在する行を全て読み込みます。読み込んだデータは、while文の繰返し処理の中で、リストarrBoxに1つづつ格納していきます。

 データが格納された配列の内容は、p arrBoxで表示できます。

にほんブログ村 ゲームブログへ

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする