web-dev-qa-db-ja.com

Kotlinでのコンソール入力の読み取り

Kotlinのコンソールからの入力を受け入れようとしていますが、構文についてあまりよくわからないので難しいです。

メインから始めます

_fun main(args: Array<String>) {

}
_

この後何を入力すればいいですか? println()readline()が関係していることは知っていますが、それらをどのように構造化するかわかりません。

目的:ユーザーに数字を入力するよう要求し、入力した数字に6を掛けます。プログラムは結果をコンソール画面に返します。

31
siur

Kotlinの標準入力からのA + Bの例を次に示します。

_fun main() {
  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() = readLine()!!.split(' ').map { it.toInt() }

fun main(vararg args: String) {
  val (a, b) = readInts()
  println(a + b)
}
_

または

_import Java.util.Scanner

fun main() {
  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)
}
_

競合プログラミング

必読のイントロ: https://kotlinlang.org/docs/tutorials/competitive-programming.html

これは(記事に触発された)すべての可能な型、リスト、配列、2D配列などを読み取るための拡張されたヘルパー関数の束です。

_private fun readln() = readLine()!!
private fun readlnByte() = readln().toByte()
private fun readlnShort() = readln().toShort()
private fun readlnInt() = readln().toInt()
private fun readlnLong() = readln().toLong()
private fun readlnFloat() = readln().toFloat()
private fun readlnDouble() = readln().toDouble()
private fun readlnBigInt(radix: Int = 10) = readln().toBigInteger(radix)
private fun readlnBigDecimal() = readln().toBigDecimal()

private fun lineSequence(limit: Int = Int.MAX_VALUE) = generateSequence { readLine() }.constrainOnce().take(limit)
private fun readlnStrings() = readln().split(' ')
private fun readlnBytes() = readlnStrings().map { it.toByte() }
private fun readlnShorts() = readlnStrings().map { it.toShort() }
private fun readlnInts() = readlnStrings().map { it.toInt() }
private fun readlnLongs() = readlnStrings().map { it.toLong() }
private fun readlnFloats() = readlnStrings().map { it.toFloat() }
private fun readlnDoubles() = readlnStrings().map { it.toDouble() }

private fun readByteArray() = readlnStrings().run { ByteArray(size) { get(it).toByte() } }
private fun readShortArray() = readlnStrings().run { ShortArray(size) { get(it).toShort() } }
private fun readIntArray() = readlnStrings().run { IntArray(size) { get(it).toInt() } }
private fun readLongArray() = readlnStrings().run { LongArray(size) { get(it).toLong() } }
private fun readFloatArray() = readlnStrings().run { FloatArray(size) { get(it).toFloat() } }
private fun readDoubleArray() = readlnStrings().run { DoubleArray(size) { get(it).toDouble() } }

private fun readlnByteArray(n: Int) = ByteArray(n) { readlnByte() }
private fun readlnShortArray(n: Int) = ShortArray(n) { readlnShort() }
private fun readlnIntArray(n: Int) = IntArray(n) { readlnInt() }
private fun readlnLongArray(n: Int) = LongArray(n) { readlnLong() }
private fun readlnFloatArray(n: Int) = FloatArray(n) { readlnFloat() }
private fun readlnDoubleArray(n: Int) = DoubleArray(n) { readlnDouble() }

private fun readByteArray2d(rows: Int, cols: Int) = Array(rows) { readByteArray().also { require(it.size == cols) } }
private fun readShortArray2d(rows: Int, cols: Int) = Array(rows) { readShortArray().also { require(it.size == cols) } }
private fun readLongArray2d(rows: Int, cols: Int) = Array(rows) { readLongArray().also { require(it.size == cols) } }
private fun readIntArray2d(rows: Int, cols: Int) = Array(rows) { readIntArray().also { require(it.size == cols) } }
private fun readFloatArray2d(rows: Int, cols: Int) = Array(rows) { readFloatArray().also { require(it.size == cols) } }
private fun readDoubleArray2d(rows: Int, cols: Int) = Array(rows) { readDoubleArray().also { require(it.size == cols) } }

private fun isWhiteSpace(c: Char) = c in " \r\n\t"

// JVM-only targeting code follows next

// readString() via sequence is still slightly faster than Scanner
private fun readString() = generateSequence { System.`in`.read().toChar() }
        .dropWhile { isWhiteSpace(it) }.takeWhile { !isWhiteSpace(it) }.joinToString("")
private fun readByte() = readString().toByte()
private fun readShort() = readString().toShort()
private fun readInt() = readString().toInt()
private fun readLong() = readString().toLong()
private fun readFloat() = readString().toFloat()
private fun readDouble() = readString().toDouble()
private fun readBigInt(radix: Int = 10) = readString().toBigInteger(radix)
private fun readBigDecimal() = readString().toBigDecimal()

private fun readBytes(n: Int) = generateSequence { readByte() }.take(n)
private fun readShorts(n: Int) = generateSequence { readShort() }.take(n)
private fun readInts(n: Int) = generateSequence { readInt() }.take(n)
private fun readLongs(n: Int) = generateSequence { readLong() }.take(n)
private fun readFloats(n: Int) = generateSequence { readFloat() }.take(n)
private fun readDoubles(n: Int) = generateSequence { readDouble() }.take(n)
_

スキャナーやや遅い であることに注意してください。これは、大規模な入力でのプログラムの実行を Scanner をプレーンな readLine に置き換えるだけで最大2倍高速化できる競合プログラミングのような場合に重要になることがあります。シーケンスを介したトークン化の準最適なreadString()実装でさえ わずかに速い です。 Kotlinの組み込みreadLine()とは異なり、次の空白まで入力トークンを読み取ることができます。

I hope いつか、コンソールとファイルの両方の入力解析サポートのための簡潔で、クロスプラットフォームで、パフォーマンスの高い、ユニバーサルがKotlin stdlibで導入されるでしょう。 readIntreadLongなどのグローバル関数やReader拡張関数と同様です。これは、競争力のあるプログラミングだけでなく、Kotlinを第一言語として学習する場合にも非常に便利です。数値を読み取るという概念では、コレクション、ラムダ、およびモナドを最初に説明する必要はありません。


ボーナス

場合によっては、コンソールの入出力から開始し、その後ファイルに切り替える必要があります。ファイルストリーム変数を使用してすべての読み取りまたは書き込み呼び出しを追加するのは面倒です。

以下は、変更されていないコンソールコードを数行でラップするだけで、ファイルの読み取りと書き込みを強制し、適切に閉じられるようにする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)
    }
}
_

折り返し行は、コンソールに切り替える必要が生じたときにすばやくコメント化できます。

64
Vadzim

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") 
    }
4
sohel yadav
fun readInts(separator: Char = ' ') = 
readLine()!!.split(separator).map(String::toInt)
fun main(args: Array<String>) {
    var A : List<Int> = readInts()
}
2
Bihy

デフォルトでは、文字列toIntを使用して整数に変換できるため、readLineは入力を受け取ります

fun main(args:Array<String>){
    var first: Int
    var second: Int
    println("Enter the first number")
    first = readLine()!!.toInt()
    println("Enter the second number")
    second= readLine()!!.toInt()
    println("The sum is ${first + second}")
}
0

KotlinでコンソールI/Oを処理する方法は複数あります。

1。 Kotlin標準ライブラリの使用:Kotlin標準ライブラリは、JDKのクラスに基づいてI/Oを処理するための拡張機能を提供します。

コンソールで印刷するには、print関数を使用できます。次のスニペットを実行する場合:

_print("Hello from Kotlin")
_

端末に次のメッセージが表示されます。

_Hello from Kotlin
_

舞台裏では、この関数はJava _System.out.print_メソッドを使用します。また、ライブラリはprintln代替関数を提供します。メッセージの。

コンソールから読み取るには、readLine関数を使用できます。

_val inputText = readLine()
_

2。 Java Standard Library:KotlinにはJavaとの優れた相互運用性があります。したがって、プログラムではJDKの標準I/Oクラスを使用できますそれらが必要です。

2.1。スキャナークラスの使用Scannerクラスの使用は非常に簡単です。インスタンスを作成し、nextLineメソッドを使用するだけです。

_val scanner = Scanner(System.`in`)

val readText = scanner.nextLine()
_

これはKotlinのキーワードであるため、バックプロパティを使用してinプロパティをエスケープしています。

2.2。 BufferedReaderクラスの使用BufferedReaderクラスを使用して標準入力ストリームから読み取るには、最初に_System.in_でインスタンス化する必要があります。

_val reader = BufferedReader(InputStreamReader(System.`in`))
_

そして、そのメソッドを使用できます—例えば、readLine()

_val readText = reader.readLine()
_

2.3。コンソールクラスの使用:以前の2つのクラスとは異なり、Consoleクラスには、readPasswordprintf

Consoleクラスを使用するには、Systemクラスからインスタンスを取得する必要があります。

_val console = System.console()

val readText = console.readLine()
_

また、KotlinのJavaとの相互運用性のおかげで、追加のJavaライブラリを使用してI/Oを処理できます。

あなたの場合、入力を読み取った後、toInt()関数を使用してString値をIntに変換できます。

0
SHoko