在Kotlin阅读控制台输入
我试图接受来自Kotlin控制台的输入,但这很难,因为我不太确定语法。
我从主要开始
fun main(args: Array<String>) { }
这之后我应该输入什么? 我知道, println()
和readline()
都涉及到,但我不知道如何构造它们。
目标:提示用户输入一个数字,输入的数字乘以6,程序返回结果到控制台显示。
这里是Kotlin的A + B例子:
fun main(vararg args: String) { val (a, b) = readLine()!!.split(' ') println(a.toInt() + b.toInt()) }
要么
fun main(vararg args: String) { val (a, b) = readLine()!!.split(' ').map(String::toInt) println(a + b) }
要么
fun readInts(separator: Char = ' ') = readLine()!!.split(separator).map(String::toInt) fun main(vararg args: String) { val (a, b) = readInts() println(a + b) }
要么
import java.util.Scanner fun main(vararg args: String) { val input = Scanner(System.`in`) val a = input.nextInt() val b = input.nextInt() println(a + b) }
要么
with(Scanner(System.`in`)) { val a = nextInt() val b = nextInt() println(a + b) }
当心扫描仪 有点慢 。 这在某些情况下可能很重要,例如竞争性编程,只要将扫描器替换为简单的readLine ,即可使程序在大型输入上的执行速度提高两倍。
我希望有一天,在Kotlin stdlib中会引入一个对控制台和文件输入解析支持的简洁,跨平台,高性能,通用的方法。
奖金
有时你从控制台输入/输出开始,但是需要切换到文件。 用文件流变量前置每个读取或写入调用变得非常繁琐。
这是一个Kotlin魔术的和平,它允许用几行代码来包装不变的控制台代码,强制它读取和写入文件,同时确保它们被正确关闭:
fun <T : Closeable, R> T.useWith(block: T.() -> R): R = use { with(it, block) } File("a.in").bufferedReader().useWith { File("a.out").printWriter().useWith { val (a, b) = readLine()!!.split(' ').map(String::toInt) println(a + b) } } Scanner(File("b.in")).useWith { PrintWriter("b.out").useWith { val a = nextInt() val b = nextInt() println(a + b) } }
当需要切换回控制台时,包装线可以快速注释掉。
使用readLine()从用户ATQ获取输入:
fun main(args:Array<String>){ print("Enter a number") var variableName:Int = readLine()!!.toInt() // readLine() is used to accept the String value and ".toInt()" will convert the string to Int. var result:Int= variableName*6 print("The output is:$result") }
fun readInts(separator: Char = ' ') = readLine()!!.split(separator).map(String::toInt) fun main(args: Array<String>) { var A : List<Int> = readInts() }