標準入力の行を行としてマップし、各行の数値を列としてマップします。
use std::io;
use std::io::prelude::*;
const SIZE: usize = 3;
fn main() {
let stdin = io::stdin();
let vec: Vec<Vec<i32>> = stdin.lock()
.lines()
.take(SIZE)
.map(|line| {
let line = line.expect("Unable to read line");
line.split_whitespace()
.take(SIZE)
.map(|s| s.parse().expect("Enable to parse number"))
.collect()
})
.collect();
println!("{:?}", vec);
}
それとも、パニックに気にしない場合:
use std::io;
use std::io::prelude::*;
use std::error::Error;
const SIZE: usize = 3;
fn main() {
let stdin = io::stdin();
let vec: Result<Vec<Vec<i32>>, _> = stdin.lock()
.lines()
.take(SIZE)
.map(|line| {
line.map_err(|e| Box::new(e) as Box<Error>)
.and_then(|line| {
line.split_whitespace()
.take(SIZE)
.map(|s| s.parse().map_err(|e| Box::new(e) as Box<Error>))
.collect()
})
})
.collect();
println!("{:?}", vec);
}
コメントからの懸念への対処:
あなたのコードは2N + 1つのアロケーション(それは重要な場合を作ります誰かがパフォーマンスを探しています
N
はここにはっきりしていませんが、割り当てられたベクターは最大3つ、各ベクターには3つのアイテムが必要です。 take
アダプタはをオーバーライドして最大3
を入力し、次にcollect
は各Vec
を構築するときにそのヒントを使用します。
マトリックスにネストされたVec
を使用すると、反パターンが発生します。
もちろん、元のコードと同じです。
あなた「ブレーク」標準入力 - あなたは確実に私はあなたがここで何を意味するかわからないんだけどlock().lines()
を呼び出した後、それを使用することはできません。 stdin.read(&mut[0,0,0]).expect("Unable to read more")
を追加して、let vec
を定義するコードの後に使用できます。
stdinを使用できないという問題が発生した場合は、先に終了するブロックにロックを適用して修正できます。
ありがとうございました!私の錆に関するすべての質問にお答えしているようですが、おそらくShemaaster交換所にサイトを変更する必要があります:) – KDN
@KDN nah;私はここであまりにも多くの時間を過ごすだけです。できるだけ良い答えを出せる人がたくさんいますが、他の人はやっていません。また、役に立つ答えを提供することさえできない領域がたくさんあります。 – Shepmaster