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

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

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

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

Q&A

解決済

3回答

1850閲覧

ああああああああああああああああああああああああああああああああああああ

wassan_nikoniko

総合スコア9

Java

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

0グッド

0クリップ

投稿2021/09/03 05:48

編集2022/05/17 11:09

ああああああああああああああああああああああああああああああああああああ

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

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

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

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

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

K_3578

2021/09/03 05:50

> ソースが少し冗長になっていると指摘をされた なら指摘した本人に聞くべきでは?
jimbe

2021/09/03 05:56

break の使い方の見直しが足りないものと思います。
1T2R3M4

2021/09/03 05:58 編集

fall throughさせるとか。 というかⅹは常に0ならswitch自体いらないのでは。
dodox86

2021/09/03 06:06 編集

私も1T2R3M4さんのご指摘と同じくfall throughを考えて、そうすればゴッソリ削れるはずですが、レビューしたら今度は「フォールスルーはバグのもとだから使っちゃダメ」とか言われそうですね。その辺り、レビュアーに確認したらどうでしょう。何か、試されているようなコードに思います。※尚、私自身は意図したフォールスルーなら迷わず使います。
BeatStar

2021/09/03 06:13

パッと見、別にswitch...caseを使わなくても実装できそうなんですけど…… 必ずswitch...casseを使わないといけませんか?
YT0014

2021/09/03 06:13

switchを使うのは必須ですか?if文で書き直すのは許されるのでしょうか?
wassan_nikoniko

2021/09/03 06:14

皆さん、ご指摘ありがとうございます。 おそらくフォールスルーという技法が一番削れるということでしたがそこで確認なのですが、 フォールスルーというのは条件式に当てはまったところ以降も処理が続くという認識なのですが、 それをどのようにうまく使っていけば削れるものなのでしょうか...? 初学者なため、まったくアイディアが浮かばないです... また、何か参考になるサイト等ございましたらご教授いただければ幸いです。
wassan_nikoniko

2021/09/03 06:14

必ずswitchでやらないといけないみたいでした
jimbe

2021/09/03 10:54

コードに kadai と入っているくらいですしね。
guest

回答3

0

こんな風にも書けます。

Java

1 switch (x) { 2 default: System.out.println("ランクなし"); break; 3 case 1: case 2: case 3: case 4: case 5: 4 while (x <= 5) 5 System.out.println("ランク" + ".ABCDE".charAt(x++) + "突破"); 6 }

投稿2021/09/03 09:10

kazuma-s

総合スコア8224

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

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

BeatStar

2021/09/03 09:26

トリッキーな書き方ですが、確かにアリっちゃアリですね。
wassan_nikoniko

2021/09/03 09:30

おお...さきにdefaultを定義してしまうということですね... case:1 2 3 4 5を定義したのちに出力で.charatで.ABCDEの順番をデクリメントで指定するということですね... すごく興味深いコードで参考になりました!(使いこなせるかは別ですが...) ありがとうございました!
guest

0

ベストアンサー

今回の場合、switch...caseを使わなくても実装できそうです。
でも追記では「必ずswitch...caseを使え」という定義のようなので、
他の方も仰っているように、「フォールスルー」を行う必要がありますね。

(この質問に出会うまで、知らなかったけど)

「フォールスルーとは」で検索すると、ここがヒットしました。

上記によると、単純にbreakを置かないだけ。らしいです。

私ならまず最初に仕様を確認します。

で、今回の冗長と言われたコード(質問にあるコード)を見ると、

1のとき: Aランク Bランク ... Eランク 2のとき: Bランク ... Eランク 3のとき: Cランク ... 4のとき: Dランク ... ...

と言う風になっていますね。

では、これらの規則性を見てみましょう。

1 -> 2 -> 3 ... と数字が上がるごとに、A,B,C, ... のアルファベット表記のランクが下がっています。

逆を言えば、「数字が小さくなれば小さくなるほど、高ランクも通る」的なものですね。

別の視点で見てみましょうか。

Aランクを突破するのはどういう条件でしょうか。
そう、x=1 を満たすときだけです。
{ 1 } だけ。

後はどうやっても突破できない。

では、Bランクは? そう、x≧2 を満たすときだけ。
つまり、{ 1, 2 } のどちらかじゃないとできない。

では Cランクは? そう、x > 3 を満たすときだけ。
つまり、{ 1, 2, 3 } のときだけ。

……と考えていくと、

「単純に、数字を1,2,3,4, ... と並べていき、フォールスルー方式でやればいい」ですね。

あえて疑似コードで書くと、

SWITCH( 対象 ): 1の場合: // Aランク到達 2の場合: // Bランク到達 3の場合: // Cランク到達 ...

って感じでしょうか。

ただ、1~5以外のもの(default)だと、「ランク無し」となりますから、区別を付けないと、「ランク無し」まで行ってしまいます。

ということで、1~4はフォールスルー方式でbreak無しでやり、5のときだけbreakで抜ける。

的な処理になるかと。

そうすれば重複している部分( 2のときは 1の時の「Aランク突破」が重複しているし ) を省くことができますよ。


[追記1]

※ ご指摘を受けての追記です。

上記でやっているフォールスルーをやる場合は、規則性を見付ける必要があります。

1~4は、「下位ランクも含まれている」ため、あえてbreakを省きます。

まずは、上記で述べたように1の場合,2の場合,... のそれぞれの「到達するランク」を列挙してみてください。

おそらく、以下のようになるはずです。

1: A, B, C, D, E 2: B, C, D, E 3: C, D, E 4: D, E 5: E その他: <ランク無し>

1~4は 下位ランクも含んでいますね。

つまり、1は 2のやつを含んでいて、2のやつは 3のやつを含んでいて、...という感じです。

ちょっと考えを変えてみると、3の場合は、 <5> + <4> + <3> となっていますね。

よって、疑似コードで書くと、

SWITCH( 対象 ): 1の場合: 「Aランク」 2の場合: 「Bランク」 3の場合: 「Cランク」 4の場合: 「Dランク」 5の場合: 「Eランク」 BREAK その他: 「該当なし」系

となるはずです。

上記疑似コードを使ってシミュレーションしてみましょう。

たとえば、X = 1 の場合。

1. まず SWICH(...) で調べる 2. 「1の場合」を見る 3. 「Aランク」が該当する 4. breakが無いので「2の場合」も見る 5. 「Bランク」も該当する 6. breakが無いので「3の場合」も見る 7. 「Cランク」も該当する ... 10. breakが無いので「5の場合」を見る 11. 「Eランク」も該当する 12. breakがあるのでSWITCHから抜ける

となり、

Aランク到達 Bランク到達 Cランク到達 Dランク到達 Eランク到達

となります。

X = 2 の場合も、

1. まずSWITCH(...)で調べる 2. 「1の場合」を見る 3. (→ 条件を満たさないため スルー) 4. 「2の場合」を見る 5. 「Bランク」に該当 6. breakが無いため 「3の場合」を見る 7. 「Cランク」も該当 ... 12. breakがあるのでSWITCHから抜ける

となり、

Bランク該当 Cランク該当 Dランク該当 Eランク該当

となる。

X = 5 のときは、

1. まずSWITCH(...)で調べる 2. 「1の場合」を見る 3. (→ 条件を満たさないため スルー) 4. 「2の場合」を見る 5. (→ 条件を満たさないため スルー) 6. breakが無いため 「3の場合」を見る 7. (→ 条件を満たさないため スルー) ... 10. breakが無いので「5の場合」を見る 11. 「Eランク」も該当する 12. breakがあるのでSWITCHから抜ける

となり、

Eランク該当

のみとなる。

で、X が 15以外の数字の場合は、上記の(1)(12)は完全スルーして、

1. まずSWITCH(...)で調べる 2. 「1の場合」を見る 3. (→ 条件を満たさないため スルー) 4. 「2の場合」を見る 5. (→ 条件を満たさないため スルー) 6. breakが無いため 「3の場合」を見る 7. (→ 条件を満たさないため スルー) ... 13. 上記の条件すべてに満たさないため defaultに 14. よって「該当無し」とする

となり、

該当なし

的なものになるはずです。

switch...caseは上からチェックしていき、該当するものがあれば、breakが出るか、最後までと到達するまで処理するようなので、今回の X が 1~4 までは break無しで処理をして、
5 で 処理をした直後にbreakを置く。

となるはずです。

投稿2021/09/03 06:31

編集2021/09/03 10:32
BeatStar

総合スコア4958

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

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

wassan_nikoniko

2021/09/03 06:37

ご返信いただきありがとうございます。 フォールスルーの技法私自身も初めて知りました...! そうですね、ランクを一つずつ追加していくという書き方をしてあげればよかったんですが どうしても浮かびませんでした!とても参考になりました。ありがとうございます!
YT0014

2021/09/03 09:51

フォールスルーの場合、意図してbreakしていないことを、コメントなどで明記することをお勧めします。
BeatStar

2021/09/03 09:53

@ YT0014さん 確かにそうですね。追記しておきます。
guest

0

たぶんフォールスルーを勉強するための課題っぽいですが
どうしても switch 使うなら

java

1package kadai.pda.k.oonuki2; 2 3public class KadaiSwitch2 { 4 5 public static void main(String[] args) { 6 int x=0; 7 switch(x) { 8 case 1: p("ABCDE"); 9 break; 10 case 2: p("BCDE"); 11 break; 12 case 3: p("CDE"); 13 break; 14 case 4: p("DE"); 15 break; 16 case 5: p("E"); 17 break; 18 default : 19 System.out.println("ランクなし"); 20 } 21 22 } 23 24 public static void p(String s) { 25 String[] a = s.split(""); 26 for (int i=0; i<a.length; i++) { 27 System.out.println("ランク" + a[i] + "突破"); 28 } 29 } 30 31}

自分ならこんなかんじでにげるかな。

投稿2021/09/03 12:31

takasima20

総合スコア7460

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問