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で表示できます。