質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

5回答

3336閲覧

標準入力された数を取得したい

sky.user.

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/05/23 08:36

編集2018/05/24 08:06

前提・実現したいこと

StringクラスのAPIを使って、2つの数を半角スペースで分けてストリーム入力させ、値を取得したいです。

(例)1と2を取得するとき
1 2

発生している問題・エラーメッセージ

正規表現(splitやscannerなどのもの)を使わずに書きたいです。

//ストリーム入力させる BufferedReader read = new BufferedReader(new InputStreamReader( System.in)); String str = read.readLine(); String str2[] = str.split(" "); String str3[] = str.split(" "); read.close(); //strをそれぞれintに変換、int num1,int num2に代入 int input1 = Integer.parseInt(str2[0]); int input2 = Integer.parseInt(str3[1]);

試したこと

上記のソース(コンパイル・実行の作動確認済)を書きましたが、
どうしても正規表現に頼った書き方になってしまいます。

補足情報(FW/ツールのバージョンなど)

テキストエディタ(Windows、メモ帳)、コマンドプロンプト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/23 09:11

StringTokenizer とかの聖遺物だしたらマイナスにされそうだからやめておく
sky.user.

2018/05/24 02:14

ご回答ありがとうございます。初めて見たので調べました…。splitの原型(?)みたいなもので、もう推奨されていないのですね…。貴重なご意見ありがとうございました!
guest

回答5

0

Scannerを使えば良いんじゃないでしょうか。

Java

1try(Scanner sc = new Scanner(System.in)) { 2 int input1 = sc.nextInt(); 3 int input2 = sc.nextInt(); 4 5 ... 6}

泥臭い処理を裏で担ってくれる分、ハマると解消が面倒な面もありますが。


String#splitは利用するが、ローカル変数が減る方法。

Java

1int[] nums = Arrays.stream(str.split(" ")) 2 .mapToInt(Integer::parseInt) 3 .toArray() 4;

慣れるまでは読みづらいですけどね。

投稿2018/05/23 08:40

編集2018/05/23 09:16
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sky.user.

2018/05/23 08:48

ご回答ありがとうございます。 実はScannerも使ったのです。。。後出し情報で申し訳ありません。 Stringクラスのものでできませんでしょうか? 使えそうと思ったものにcharAtやindexOfなどがあったのですが、使い方がよく 分からないのです。。。
LouiS0616

2018/05/23 08:55

Stringクラスのもので『なにを』したいのでしょうか?
sky.user.

2018/05/23 08:59

目的という意味でよろしいでしょうか? 2つの数を半角スペースで分けてストリーム入力させた物の値を取得したいです。 (値の型は後でint型に変換するのでString型で大丈夫です。)
LouiS0616

2018/05/23 09:08

splitを使うのが最も素直で簡単な方法だと思いますよ。 ご提示のコードでちょっと変なのは、str2とstr3を作っていることでしょうか。
sky.user.

2018/05/24 02:18

返答が遅くなってしまい、申し訳ありません。 str2とstr3のところは、上でStars1024さんが直してくださったように 私の認識が間違っておりました…。 ありがとうございました!
guest

0

... 正規表現(splitなどのもの)を使わずに書きたい ...

一文字ずつ処理してみました。

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4 5public class ParseInt { 6 public static void main(String[] args) { 7 try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { 8 String line = br.readLine(); 9 int n = 0; 10 for (char ch : line.toCharArray()) { 11 int p = "0123456789".indexOf(ch); 12 if (p >= 0) { 13 n = 10 * n + p; 14 } else { 15 System.out.println("read: " + n); 16 n = 0; 17 } 18 } 19 } catch (IOException e) { 20 e.printStackTrace(); 21 } 22 } 23}

実行例

イメージ説明

工夫しだいで、 数式 "(1 + 2)*3" から 9 を得るように拡張していくこともできるはずです。

投稿2018/05/23 13:11

編集2018/05/24 13:47
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sky.user.

2018/05/24 05:30

ご回答ありがとうございます。 拡張for文に慣れていないため、解読に時間がかかってしまいました…。 2点、コードの質問なのですが、 >>int n = 0;; なぜセミコロンが2つ必要なのでしょうか?(まだ書き方になれていないので…すみません。) >> if (p >= 0) { n = 10 * n + p; } else { System.out.println("read: " + n); n = 0; } これはどんな処理をしているのでしょうか?
katoy

2018/05/24 13:52

int n = 0;; は int n = 0; に修正しました。 文字を読み、それが数字でなければ、現時点での解釈値を表示します。 数字だったら現時点の解釈値 を更新します。 "1", "2", "3" と文字を読み込んだ場合、解釈値は 1, 12, 123 と変化していきます。
guest

0

こんにちは、split関数を使わない方法だと以下のような方法があります。

(i)replace関数を使い空白を消す方法
.replace関数を使い空白を消す方法があります。消去したらsubstringで分けましょう。
(charAtのほうが簡単ですが、質問欄にあるコードに合わせString型で出力したかったので
.substringを使いました。)

Java

1import java.util.Scanner; 2 3public class Main { 4 public static void main(String[] args){ 5 Scanner sc = new Scanner(System.in); 6 String line = sc.nextLine(); 7 String line2 = line.replace(" ",""); 8 String []result = new String[line2.length()]; 9 for(int i = 0; i < line2.length(); i++){ 10 result[i] = line2.substring(i,i + 1); 11 System.out.println(result[i]); 12 } 13 } 14}

また、substringで分ける方法以外でも整数に変換してデータを得る方法もあります。
(replaceで空白を消すところまでは同じです。)

(i)Integer.parseで変数に変換する。

このとき、空白を消した後の文字列の長さは(i)によって変換された変数の桁数に等しいです。

(ii) for文を使い配列にデータを格納する

10で割った余りを求め、それを配列に格納し、そのあと10で割る...
これを桁数分だけ繰り返します。

Java

1import java.util.Scanner; 2 3public class Main { 4 public static void main(String[] args){ 5 Scanner sc = new Scanner(System.in); 6 String line = sc.nextLine(); 7 String line2 = line.replace(" ",""); 8 int n = Integer.parseInt(line2); 9 int []result = new int[line2.length()]; 10 for(int i = 0; i < line2.length(); i++){ 11 result[line2.length() - i - 1] = n % 10; 12 n /= 10; 13 } 14 for(int i = 0; i < line2.length(); i++){ 15 System.out.println(result[i]); 16 } 17 } 18}

ちなみに

質問欄にあるコードですが 、split関数を使う場合str2str3に分ける必要はありません。
一応、以下のコードでできます。

(入力されるデータの長さがいくらになっても対応できる汎用的なものにしました。)

Java

1import java.util.Scanner; 2 3public class Main { 4 public static void main(String[] args){ 5 Scanner sc = new Scanner(System.in); 6 String line = sc.nextLine(); 7 8 String []resultArray = line.split(" "); 9 10 for(int i = 0; i < (line.length() + 1) / 2; i++){ 11 System.out.println(resultArray[i]); 12 } 13 } 14}

投稿2018/05/23 12:17

編集2018/05/23 12:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sky.user.

2018/05/24 02:30

ご回答ありがとうございます。 そうなのです、charAtだとStringで出てこなかったので悩んでおりました...。 replaceとsubstringの組み合わせでこんなことができるのですね。 まだ単体だけでも上手く使いこなせていないため、目から鱗です。 また、先にLouiS0616さんが御指摘くださったように、splitの使い方を誤認していたようです...。 詳細なコードまであげていただき、ありがとうございます!
guest

0

java

1 2String str = "1 2"; 3int spacePosition = str.indexOf(' '); 4int input1 = Integer.parseInt(str.substring(0, spacePosition)); 5int input2 = Integer.parseInt(str.substring(spacePosition + 1)); 6System.out.println("input1=" + input1); 7System.out.println("input2=" + input2);

投稿2018/05/23 09:53

overkneeeboot

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sky.user.

2018/05/24 02:24

ご回答ありがとうございます。 今回やりたい処理というのが1と2の場合だけでなく、標準入力で読み込むというものだったのです。 私の書き方が拙く、申し訳ありません。 (strをBufferedReaderで読み込む処理を別でやればいけるでしょうか?)
guest

0

java

1String del = " "; 2int index = 0; 3while (index >= 0) { 4 int end = str.indexOf(del); 5 String elem = str.substring(0, end); 6 index = end + del.length(); 7}

こんな感じのこと?elemは配列か何かに入れないとだけど

投稿2018/05/23 09:44

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sky.user.

2018/05/24 02:20

ご回答ありがとうございます。 whileでまわすやり方もあるのですね…勉強になります。 ありがとうございます!
swordone

2018/05/24 02:34

突貫で書いたので間違ってます。このままだと確実に例外が発生します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問