2016-10-09 11 views
0

から番号を取得した文字列は、たとえば"r1"のために、と私はJavaのスキャナ文字列

Scanner sc = new Scanner("r1"); 
int result = sc.nextInt(); // should be 1 

int形で1を必要とするが正しくコンパイルが、実行時エラーを持って、私は区切り文字を使用すべきですか?区切り文字が何をするのかわかりません。

+0

投票が再開されました。欲望行動、具体的な問題、そして明確な問題声明が存在した。この質問は非常に単純です。コードの実際の行は実際には必要ありません。書かれた形式で提示された情報を解釈するなどの基本的な機能を実行できる頭脳を持っていることが望ましいからです。しかし、私は想像力を失わせるために、それを実際のコードの任意のビットに置き換えました。 –

+0

おそらく最も重要な情報、つまりエラーメッセージを投稿するのを忘れました。それはあなたに何が間違っているのかを教え、あなたはそれを修正したり、それから変えるべきことを学びます。 –

答えて

3

さて、いくつかのオプションがあります。あなたは文字通りをスキップしたいので、を "r"にしてから番号を読み、Scanner#skipとすることができます。

Scanner sc = new Scanner("r1"); 
sc.skip("[^0-9]*"); 
int n = sc.nextInt();  

は先頭に数字以外が存在しない場合にも動作します。たとえば、すべての非桁が、その後数を読み飛ばします。

もう1つの方法は、前述したように、デリミタとして非数字を使用することです。

Scanner sc = new Scanner("x1 r2kk3 4 x56y 7g"); 
sc.useDelimiter("[^0-9]+"); // note we use + not * 
while (sc.hasNextInt()) 
    System.out.println(sc.nextInt()); 

出力6つの数字:例えば1、2、3、4、56、7

さらに別のオプション、あなたの入力の性質に応じて、前処理することです例えば、デフォルトの設定でスキャナを使用して、その後、前もって空白ですべての非数字を置き換えることにより、文字列:

String input = "r1"; 
input = input.replaceAll("[^0-9]+", " "); 

そして、もちろん、あなたは常にだけでしたプリプロセスの最初の文字を削除する文字列その形になっていることが分かっている場合は、スキャナを使用してください(またはInteger#parseInt ):

String input = "r1"; 
input = input.substring(1); 

あなたのしていることは、あなたの入力に最も適切なものによって異なります。 「非数字」を、スキップしたいものと完全に置き換えます。私は光scolding is in order for thisを信じところで


:区切り文字が何

イムはわかりません。

イントロテキストにScannerexplains this quite clearlyのドキュメントがあり、さらに例を示しています。

さらに、「デリミタ」という語自体の定義はreadily availableです。

0

フォーマットは最後の文字は、あなたがこれを使用することができた値であるすべての入力に対して同じである場合:

String s = sc.nextLine() 
Int i = Integer.parseInt(s.charAt(s.length() -1)); 
エルス

あなたはインスタンスの文字列char配列作ることができ、それを谷とチェック繰り返します各charが数値かどうか

+0

文字列が "r15gsi"の場合はどうなりますか? –

+0

@MistahFiggins私は、フォーマットが期待されるすべての文字列で同じになると思いました。 – Jonatan

+0

@ジョナタンもしあなたが* int * i = 1;ではなく、具体的なものになりたいならば、lol :) –

0

ここにいくつかの間違いがあります。

まず、あなたが言う:

One = sc.nextInt("r1");

は正しくコンパイル...

いいえ。 scが実際にjava.util.Scannerである場合は、Scanner.nextInt(String)メソッドが存在しないため、コンパイルできません。

第2の問題は、hasNextXXXnextXXXのメソッドが引数を解析しないということです。スキャナの入力ソースの文字を解析します。

第3の問題は、Scannerは、あなたが(明らかに)しようとしていることをする単一の方法を提供していないことです。


あなたが値"r1"が含まれているStringsを持っている場合は、あなたがすべてでScannerを必要としません。フィールドには、番号を抽出する前に、予想される形式であることを確認し

Matcher m = Pattern.compile("r(\\d+)").matcher(s); 
if (m.matches()) { 
    int i = Integer.parseInt(m.group(1)); 
} 

...:

String s = ... 
int i = Integer.parseInt(s.substring(1)); 

または多分この何か:あなたは私たちにこのような何かを行うに必要なもの。

String s = sc.next(); 

をし、その後、上記のように番号を抽出します。一方

あなたが本当にスキャナそれらから文字列を読み込むしようとしている場合

は、あなたがこのような何かを行うことができます。

+0

(OPのポストはアイデアを説明する擬似コードでした) –

+0

@JasonC - 実際に彼はそれを提示しましたJavaコードとして。彼はそれが正しくコンパイルされたと言っています。そして、擬似コードでさえ、それは誤っているのです。なぜなら、それは遠隔的に「スキャナ」が実際にどのように動作するのではないからです。 –

関連する問題