基于 node 的 readline 一样可以使用标准流的输入输出
对于大学生在刚开始学习 c ,c++, java 的时候, 写着 hello word 的代码, 然后在命令框中输入输出;
基于很多算法的学习, 在我短浅的认识中, 身边的同学都是使用 c, c++, 甚至是 java 去写;
很多算法题目中的输入描述和输出描述
例如牛客网上的算法题:
类似于这种的东西, 在杭州 acm 的算法题目也是.
诀窍 ------ 使用 nodejs 内置封装好的 readline 模块;[kbd][/kbd]
1.readline 模块 [逐行读取]
readline 主要的功能是提供了一个可以从可读流中读取数据;
这里可以对 nodejs 的可读流和可写流进行深入研究
2. 如何使用 readline?
一个基本的例子:
- // 引入 readline 模块
- const readline = require('readline');
- // 创建 readline 接口实例
- const option ={
- input:process.stdin,
- output:process.stdout,
- prompt:'>>'
- }
- const rl = readline.createInterface(option);
- rl.question('你觉得 js 的这个模块怎么样?', (answer) => {
- // 对答案进行处理
- // 注意: log 中的要使用 `` 而不是 '';
- console.log(` 你觉得:${answer}`);
- // 关闭标准流
- rl.close();
- });
详情可以点击我的 github 的 readline_dome.js https://github.com/heycqing/data-structure/blob/master/standard/readline_demo.js
3. 进一步扩展去应用
3.1 例如做一个简单的命令行界面;
- // 来自官方例子实现的命令界面;
- const readline = require('readline');
- const rl = readline.createInterface({
- input: process.stdin,
- output: process.stdout,
- prompt: 'input>'
- });
- // rl.prompt() 方法会在 output 流中新的一行写入 readline.Interface 实例配置后的 prompt, 用于为用户提供一个可供输入的新的位置.
- rl.prompt();
- // 'line'事件是 获取用户输入的值直到按下 [return / enter] 按键;\n,\r 或 \r\n
- rl.on('line', (line) => {
- // ob.trim()==> 从字符串中移除前导空格, 尾随空格和行终止符.
- switch (line.trim()) {
- case 'hello':
- console.log('world!');
- break;
- default:
- console.log(` 你输入的是:'${line.trim()}'`);
- break;
- }
- rl.prompt();
- }).on('close', () => {
- console.log('再见!');
- // 推出标准流;
- process.exit(0);
- });
3.2 类似于牛客网编程的例子;
这是一个单行读取的 demo
- const readline = require('readline');
- const fs = require('fs')
- // 单行读取;
- const options={
- input:process.stdin,
- output:process.stdout
- }
- const rl = readline.createInterface(options);
- // 单行读取;
- rl.on('line',function(line){
- line.trim();
- console.log(` 你输入的值 (移除前导空格, 尾随空格和行终止符):${line.trim()}`)
- })
这是一个多行读取的 demo
- const readline = require('readline');
- const fs = require('fs')
- // 多行读取;
- const options={
- input:process.stdin,
- output:process.stdout
- }
- const rl = readline.createInterface(options);
- // 多行读取
- // 多行处理的思路是: 1. 需要设定未开始读取的行数标志, 并且如果开始读取的第一行是 n 行的行数;
- // 2. 需要通过判断是否已经到了设定的行数, 若到了则只需在里面处理相关的算法逻辑;
- var n = -1;
- var sum = (a,b)=>a+b;
- var arr =[];
- rl.on('line',function(line){
- // 表示已经在读取第一行的 n 行数;
- if(n == -1){
- // 类型转换和去除首位空格和终止符; 并把行数赋值给 n;
- n = parseInt(line.trim());
- console.log('n:'+n)
- }
- else{
- // 存入数组;
- arr.push(line.trim());
- if(n == arr.length){
- // 这里是执行你要的代码;
- // var result = arr[1];
- var result = sum(arr[0],arr[1]);
- console.log("result:"+result)
- // 恢复没读取状态;
- arr.length=0;
- n=-1;
- }
- }
- })
来自在牛客网上在线编程的痛点, 由于一开始在 javascript 使用算法编程, 不太懂得 js 的输入输出流,
做起来在这上面花了不少时间 - -!
- [nodejs] http://nodejs.cn/api/readline.html nodejs
- [console.log] https://segmentfault.com/a/1190000012957199#articleHeader0 console.log
- [ob.trim()] https://msdn.microsoft.com/library/ff679971(v=vs.94).aspx
来源: http://www.jianshu.com/p/16aa94edd041