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

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

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

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

Q&A

解決済

5回答

2604閲覧

無駄な処理を省きたい。

R.lawliet

総合スコア41

Java

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

0グッド

0クリップ

投稿2015/04/27 05:43

編集2015/04/27 05:47

お世話になっております。
現在以下の課題を解き進めております。

lang

1/*1から50まで順に数を表示する。 2ただし、その数が3の倍数の付く数字の場合、数字の後に!を表示する。 3 45の倍数の場合は、数字の後に?と表示する。 5両方の条件に合致した場合、数字の後に!?と表示する。* 6/

僕なりにはそこそこ綺麗に書けたと思ったのですが、
3でも5の倍数でもない数値まで全てString変換するのはロスだと言われました。

しかしifの後に文字列変換を行うと、3の倍数のifで宣言して5でも宣言・・・
となると、3の倍数かつ5の倍数の時に"!"が"?"で上書きされてしまいます。

どうか記号がつかない数字に手を加えず!と?を綺麗に加える方法を教えて下さい。

lang

1public class Forked { 2 public static void main(String[] args) { 3 for (int i = 1; i <=50; i++){ 4 //String変数numberにiを変換 5 String number = String.valueOf(i); 6 7 //3の倍数の時numberに"!"を追加 8 if (i % 3 == 0){ 9 number = number + "!"; 10 } 11 12 //5の倍数の時numberに"?"を追加 13 if(i % 5 == 0){ 14 number = number + "?"; 15 } 16 //表示 17 System.out.println(number); 18 } 19 } 20 21}

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

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

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

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

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

guest

回答5

0

標準出力は文字変換しないといけないのだから、不正解ではないと思いますよ。
と、あっさり言うと変に言いくるめられそうですから、ソースコードを眺めましょう。

Print.io.PrintStream::println(int)
https://docs.oracle.com/javase/jp/6/api/java/io/PrintStream.html#println(int)

これ、ソースを見ると、こうなってます。

lang

1 public void println(int x) { 2 synchronized (this) { 3 print(x); 4 newLine(); 5 } 6 } 7 8 public void print(int i) { 9 write(String.valueOf(i)); 10 } 11 12 private void write(String s) { 13 try { 14 synchronized (this) { 15 ensureOpen(); 16 textOut.write(s); 17 textOut.flushBuffer(); 18 charOut.flushBuffer(); 19 if (autoFlush && (s.indexOf('\n') >= 0)) 20 out.flush(); 21 } 22 } 23 catch (InterruptedIOException x) { 24 Thread.currentThread().interrupt(); 25 } 26 catch (IOException x) { 27 trouble = true; 28 } 29 }

ちなみにStringの場合は、こう。

lang

1 public void println(String x) { 2 synchronized (this) { 3 print(x); 4 newLine(); 5 } 6 } 7 8 public void print(String s) { 9 if (s == null) { 10 s = "null"; 11 } 12 write(s); 13 }

標準出力を行う場合、必然的に文字列に変換して出力を行います。
つまり、3、5で割り切れない数値を文字列に変換するという行為はロスではありません。
変換するタイミングが異なるだけです。

よって、指摘は絶対的な正解とは言い切れません。

投稿2015/04/27 06:54

takiru

総合スコア130

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

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

R.lawliet

2015/04/27 07:20

わざわざコメントをありがとうございます。 printのメソッド内の処理は裏で変換されていたのですね。 とても勉強になります。 まだ右も左もわからないので指摘されたらそれが絶対正解と思い込んでしまいがちです。 人に見せる正解と自分の中の正解は別に持っていると良いかもしれませんね。
guest

0

だとしたら,付ける記号を別に用意しておけばいいのではないでしょうか?

lang

1public class Forked { 2 public static void main(String[] args) { 3 for (int i = 1; i <=50; i++){ 4 //記号を格納するString変数を用意 5 String signal = ""; 6 7 //3の倍数の時signalに"!"を追加 8 if (i % 3 == 0){ 9 signal += "!"; 10 } 11 12 //5の倍数の時signalに"?"を追加 13 if(i % 5 == 0){ 14 signal += "?"; 15 } 16 //表示 17 System.out.println(i + signal); 18 } 19 } 20 21}

余談ですが,printlnメソッドはString型,boolean型,char型以外の引数を取った時
String.valueOfメソッドが内部で実行されるので,ロスかと言われるとやや疑問です.


更に余談
数値→文字列変換は色々方法がありますが,その速さに関して面白い実験をした方がいました.
あえて言うほどではない 数値 ⇔ 文字列変換 Java編

投稿2015/04/27 05:56

編集2015/04/27 09:14
swordone

総合スコア20651

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

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

R.lawliet

2015/04/27 06:02

swordoneさん、返答ありがとうございます。 実はその案はフローチャートの時点で落とされてしまいました。 System.out.printを最後に纏めてみましょう。 とのコメントで、現在のコードに辿り着いております。 質問の段階で書いておくべきでしたね、申し訳ありません。
R.lawliet

2015/04/27 06:19

追記ありがとうございます。 おぉ、シンプルなコードで良いですね♪ BAは譲ってしまいましたがこちらを参考に修正を加えてみたいと思います。 ありがとうございます。 お二人方の解答から中身の無い宣言の方法を学ばせて頂きました。
guest

0

ベストアンサー

3の倍数のif分で変換しますが、変数はifの外で持っていれば可能ですよ
5の倍数のif分の中ではStringのインスタンスが生成されていなければ、生成するようにします。

lang

1public class Forked { 2 public static void main(String[] args) { 3 for (int i = 1; i <=50; i++){ 4 String number = null; 5 if (i % 3 == 0){ 6 number = String.valueOf(i); // String変換 7 number = number + "!"; 8 } 9 if(i % 5 == 0){ 10 if(number == null){ // 3の倍数ではなかったらここでString変換 11 number = String.valueOf(i); 12 } 13 number = number + "?"; 14 } 15 if(number != null){ // Stringに変換せれていればnumberを出力 16 System.out.println(number); 17 }else{ // Stringに変換されていなければiを出力 18 System.out.println(i); 19 } 20 21 } 22 } 23 24}

これでいかがでしょうか?

投稿2015/04/27 05:53

runun

総合スコア305

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

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

R.lawliet

2015/04/27 06:09

素晴らしいですね! 感動しました。 なるほど、nullで作っておくことでif内での変換が可能になるのですね。 丁寧に書いて頂けたのでとても理解しやすかったです♪ ベストアンサーをお送り致します。
guest

0

改行を行わない System.out.print() と
改行を行う System.out.println() を使い分けてはいかがでしょうか。

lang

1for (int i = 1; i <=50; i++){ 2 System.out.print(i); 3 if (i%3==0) { 4 System.out.print("!"); 5 } 6 if (i%5==0) { 7 System.out.print("?"); 8 } 9 System.out.println(); 10}

投稿2015/04/27 07:20

nagise

総合スコア87

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

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

0

lang

1public class Forked { 2 public static void main(String[] args) { 3 for (int i = 1; i <= 50; i++) { 4 // 3 の倍数なら"!" 5 // 5 の倍数なら"?" 6 // 5 の倍数なら"!?" 7 String optstr = ((i % 3 == 0) ? "" : "!") + ((i % 5 == 0) ? "" : "?"); 8 System.out.printf("%d%s\n", i, optstr); 9 } 10 } 11}

投稿2015/04/27 14:15

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問