回答:
あなたはから最初の文字を取ることができますScanner.next
:
char c = reader.next().charAt(0);
使用できる文字を1つだけ消費するには:
char c = reader.findInLine(".").charAt(0);
厳密に 1文字を消費するには、次のように使用できます。
char c = reader.next(".").charAt(0);
char c = reader.next("[a-zA-Z]").charAt(0);
スキャナーから文字を取得するAPIメソッドはありません。返された文字列に対してメソッドを使用しscanner.next()
、String.charAt(0)
メソッドを呼び出す必要があります。
Scanner reader = new Scanner(System.in);
char c = reader.next().charAt(0);
空白で安全を期すtrim()
ために、最初に文字列を呼び出して空白を削除することもできます。
Scanner reader = new Scanner(System.in);
char c = reader.next().trim().charAt(0);
reader.next()
最初の白以外の文字から始まる文字列はすでに得られていませんか?
この問題に対処するには3つの方法があります。
next()
スキャナーを呼び出して、文字列の最初の文字を抽出しcharAt(0)
ます(例:)行の残りの部分を文字として読みたい場合は、文字列の残りの文字を繰り返し処理します。他の答えはこのコードを持っています。
setDelimiter("")
区切り文字を空の文字列に設定するために使用します。これによりnext()
、ちょうど1文字の長さの文字列にトークン化されます。したがって、繰り返し呼び出しnext().charAt(0)
て文字を繰り返すことができます。その後、区切り文字を元の値に設定して、通常の方法でスキャンを再開できます。
Scanner APIの代わりにReader APIを使用します。このReader.read()
メソッドは、入力ストリームから読み取った単一の文字を配信します。例えば:
Reader reader = new InputStreamReader(System.in);
int ch = reader.read();
if (ch != -1) { // check for EOF
// we have a character ...
}
を介してコンソールから読み取る場合System.in
、入力は通常オペレーティングシステムによってバッファされ、ユーザーがENTERを入力したときにのみアプリケーションに「解放」されます。したがって、アプリケーションが個々のキーボードストロークに応答するように意図している場合、これは機能しません。OSレベルでコンソールのラインバッファリングをオフにするか、回避するには、OS固有のネイティブコードを実行する必要があります。
参照:
「キーボード入力を一度に1文字ずつ取得する」というこの問題は非常に簡単に解決できます。これを使用することにより、スキャナーをすべて使用する必要がなく、副作用として入力バッファーをクリアする必要もありません。
char c = (char)System.in.read();
必要なのがC言語の「getChar()」関数と同じ機能である場合、これはうまく機能します。"System.in.read()"の大きな利点は、グラブするたびにバッファがクリアされないことです。したがって、すべてのユーザー入力が必要な場合でも、残りの入力を入力バッファーから取得できます。"char c = scanner.next().charAt(0);"
方法は、charをつかむませんが、バッファをクリアします。
// Java program to read character without using Scanner
public class Main
{
public static void main(String[] args)
{
try {
String input = "";
// Grab the First char, also wait for user input if the buffer is empty.
// Think of it as working just like getChar() does in C.
char c = (char)System.in.read();
while(c != '\n') {
//<do your magic you need to do with the char here>
input += c; // <my simple magic>
//then grab the next char
c = (char)System.in.read();
}
//print back out all the users input
System.out.println(input);
} catch (Exception e){
System.out.println(e);
}
}
}
これがお役に立てば幸いです。PS申し訳ありませんが、これは古い投稿であることを知っていますが、私の回答が新しい洞察をもたらし、この問題を抱えている他の人々を助けることができることを願っています。
これは実際には機能しません:
char c = reader.next().charAt(0);
この質問には、適切な説明と参照がいくつかあります 。ScannerクラスにnextCharメソッドがないのはなぜですか。 「スキャナーは、区切り文字パターンを使用して入力をトークンに分割します」。これはかなりオープンエンドです。例えばこれを使うとき
c = lineScanner.next().charAt(0);
この入力行 "(1 + 9)/(3-1)+ 6-2"の場合、次の呼び出しは "(1"を返します。cは '('に設定され、最終的には ' next()への次の呼び出しで1 '
通常、空白文字を無視したい文字を取得したい場合。これは私のために働きました:
c = lineScanner.findInLine("[^\\s]").charAt(0);
"[^\\s]" === "\\S"
import java.util.Scanner;
public class userInput{
public static void main(String[] args){
// Creating your scanner with name kb as for keyBoard
Scanner kb = new Scanner(System.in);
String name;
int age;
char bloodGroup;
float height;
// Accepting Inputs from user
System.out.println("Enter Your Name");
name = kb.nextLine(); // for entire line of String including spaces
System.out.println("Enter Your Age");
age = kb.nextInt(); // for taking Int
System.out.println("Enter Your BloodGroup : A/B/O only");
bloodGroup = kb.next().charAt(0); // For character at position 0
System.out.println("Enter Your Height in Meters");
height = kb.nextFloat(); // for taking Float value
// closing your scanner object
kb.close();
// Outputting All
System.out.println("Name : " +name);
System.out.println("Age : " +age);
System.out.println("BloodGroup : " +bloodGroup);
System.out.println("Height : " +height+" m");
}
}
Stringの読み取りから最初の文字を抽出する代わりに、より高速な結果を得るにはカスタム入力リーダーを使用する必要があります。カスタムScanReaderと説明のリンク:https ://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8
Charをスキャンするためのコード:
BufferedInputStream br=new BufferedInputStream(System.in);
char a= (char)br.read();
2つのアプローチがあり、正確に 1文字または厳密に 1文字を取ることができます。正確に使用すると、リーダーは、入力した文字数に関係なく、最初の文字のみを取得します。
例えば:
import java.util.Scanner;
public class ReaderExample {
public static void main(String[] args) {
try {
Scanner reader = new Scanner(System.in);
char c = reader.findInLine(".").charAt(0);
reader.close();
System.out.print(c);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
「abcd」などの一連の文字を入力として指定すると、最初の文字、つまり文字「a」のみが考慮されます。
ただし、厳密に使用する場合、入力は1文字のみにする必要があります。入力が複数の文字の場合、リーダーは入力を受け取りません
import java.util.Scanner;
public class ReaderExample {
public static void main(String[] args) {
try {
Scanner reader = new Scanner(System.in);
char c = reader.next(".").charAt(0);
reader.close();
System.out.print(c);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
入力に「abcd」を指定した場合、入力は行われず、変数cの値はNullになります。
package Pack;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
char c = reader.next(".").charAt(0);
}
}
1文字だけを取得するにはchar c = reader.next( "。")。charAt(0);
// Use a BufferedReader to read characters from the console.
import java.io.*;
class BRRead {
public static void main(String args[]) throws IOException
{
char c;
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter characters, 'q' to quit.");
// read characters
do {
c = (char) br.read();
System.out.println(c);
} while(c != 'q');
}
}
Scanner.next()を使用して文字列を取得し、返された文字列に対してString.charAt(0)メソッドを呼び出す必要があります。
例:
import java.util.Scanner;
public class InputC{
public static void main(String[] args) {
// TODO Auto-generated method stub
// Declare the object and initialize with
// predefined standard input object
Scanner scanner = new Scanner(System.in);
System.out.println("Enter a character: ");
// Character input
char c = scanner.next().charAt(0);
// Print the read value
System.out.println("You have entered: "+c);
}
}
出力
Enter a character:
a
You have entered: a
char型の値を取得するには、これを記述するだけです。
char c = reader.next().charAt(0);
Scanner key = new Scanner(System.in);
//shortcut way
char firstChar=key.next().charAt(0);
//how it works;
/*key.next() takes a String as input then,
charAt method is applied on that input (String)
with a parameter of type int (position) that you give to get
that char at that position.
You can simply read it out as:
the char at position/index 0 from the input String
(through the Scanner object key) is stored in var. firstChar (type char) */
//you can also do it in a bit elabortive manner to understand how it exactly works
String input=key.next(); // you can also write key.nextLine to take a String with spaces also
char firstChar=input.charAt(0);
char charAtAnyPos= input.charAt(pos); // in pos you enter that index from where you want to get the char from
ちなみに、charを直接入力として受け取ることはできません。上記のように、最初に文字列が取得され、次にcharAt(0)が取得されます。見つかって保存されます
特定の文字列内の文字のインデックスを見つけるには、次のコードを使用できます。
package stringmethodindexof;
import java.util.Scanner;
import javax.swing.JOptionPane;
/**
*
* @author ASUS//VERY VERY IMPORTANT
*/
public class StringMethodIndexOf {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
String email;
String any;
//char any;
//any=JOptionPane.showInputDialog(null,"Enter any character or string to find out its INDEX NUMBER").charAt(0);
//THE AVOBE LINE IS FOR CHARACTER INPUT LOL
//System.out.println("Enter any character or string to find out its INDEX NUMBER");
//Scanner r=new Scanner(System.in);
// any=r.nextChar();
email = JOptionPane.showInputDialog(null,"Enter any string or anything you want:");
any=JOptionPane.showInputDialog(null,"Enter any character or string to find out its INDEX NUMBER");
int result;
result=email.indexOf(any);
JOptionPane.showMessageDialog(null, result);
}
}
最も簡単な方法は、最初に変数を文字列に変更し、入力を文字列として受け入れることです。次に、if-elseまたはswitchステートメントを使用して、次のように入力変数に基づいて制御できます。
Scanner reader = new Scanner(System.in);
String c = reader.nextLine();
switch (c) {
case "a":
<your code here>
break;
case "b":
<your code here>
break;
default:
<your code here>
}