🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

Q&A

解決済

5回答

2166閲覧

javaで数値や文字列の比較がしたい。

tmp-user

総合スコア44

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

0グッド

1クリップ

投稿2019/10/22 09:39

編集2019/10/24 12:30

お世話になっております。

javaの学習サイト等を回っていると数値や文字列の比較が必要となる問題によく当たるのですがこのような比較対象が3つ以上あるケースはif文以外で何かもっとスマートな書き方はあるでしょうか。

比較が二つしかない場合は
数値比較ですと number1 == number2 ;
文字列比較ですと str1.equals(str2);
と書くのが一番シンプルだという認識です。

もし下記のようなif文よりシンプルな記法がありましたらご教示いただきたいです。

java

1 2 3 public static void main(String[] args) { 4 Scanner sc = new Scanner(System.in); 5 int N1 = 10; 6 int N2 = 10; 7 int N3 = 10; 8 9 System.out.println(check (N1,N2,N3)); 10 } 11//自己定着の為メソッド化しただけです。 12 public static String check(int X,int Y,int Z){ 13 if (X==Y && Y == Z){ 14 return "Same"; 15 }else{ 16 return "Different"; 17 } 18 }

みなさま、多数のアドバイスをありがとうございます。
直接リプライを送るべきなのですが繰り広げられている議論に知識的についていけず的外れな回答になりそうなのでこちらでお礼申し上げます。

どれも興味が湧く内容でしたので別途試して理解できるよう学習をしていこうと思います。

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

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

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

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

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

guest

回答5

0

ベストアンサー

質問の方法が一番シンプルなように思います。
ただ似たような判定を多用するのであれば、メソッドに切り出しても良いでしょう。

Java

1static boolean allSame(int... args) { 2 if(args.length <= 1) { 3 return true; 4 } 5 6 for(int i = 1; i < args.length; ++i) { 7 if(args[i-1] != args[i]) { 8 return false; 9 } 10 } 11 12 return true; 13}

こんなふうに使います。

JShell

1jshell> allSame() 2$ ==> true 3 4jshell> allSame(1) 5$ ==> true 6 7jshell> allSame(1, 1) 8$ ==> true 9 10jshell> allSame(1, 1, 1) 11$ ==> true 12 13jshell> allSame(1, 1, 1, 2) 14$ ==> false

配列をそのまま渡しても構いません。

JShell

1jshell> int[] arr = {1, 1, 1, 1}; 2arr ==> int[4] { 1, 1, 1, 1 } 3 4jshell> allSame(arr) 5$ ==> true

StackOverflowにも同様の議論がありました。
様々な方法が提案されていますが、どれも直接比較よりは分かりづらい印象です。
Java all determine elements are same in a list - Stack Overflow

投稿2019/10/22 10:09

編集2019/10/22 10:25
LouiS0616

総合スコア35668

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

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

hermit19901127

2019/10/22 10:14

連続されて入力されてくるだろう文字を単なる「個別に宣言した変数」として扱うか、「いったんArrayなりに加工した上」で扱うかにもよりますね… そのうえでLouiS0616さんのおっしゃる通り、関数で処理などするなど、対応方法はいくらでもあるかと思う次第です…
LouiS0616

2019/10/22 10:33 編集

常用する分には可変長が一番使いやすいのかな、という印象です。 int... と Object... でオーバーロードするとすぐにエラーを吐くのが難点ですが。
hermit19901127

2019/10/22 10:29

実はこちらにコメントして、後で気づいたのですが、「可変長」が引数として使えるのを完全に失念してた次第です… 最初に入った会社でJava使ってたのですが、Javaプログラマー失格です…お恥ずかしい… N1、N2、N3…と際限なく単体のint型が宣言された上で、まとめて与えられると考えると 「不定の数の単体のint型が与えられる」状態に対応した、たしかにLouiS0616さんの提示する通りの関数を作るが最適解のように思えます…
Zuishin

2019/10/22 11:16

おかしい。 > javaで数値や文字列の比較がしたい。 という質問なのになぜこちらが +2 で私の回答が 0 なんだろう。 Stream を使うのはなるべく避けるべきという理由や文化がありますか?
LouiS0616

2019/10/22 11:37

> Stream を使うのはなるべく避けるべきという理由や文化がありますか? たまにそのような主張をする人はいますが、納得できる理由を聞いたことはありません。 私が回答にStreamを用いていないのは、回答の主眼を『メソッド化』に置いていて、実装はあくまで例として提示しているだけだからです。
Zuishin

2019/10/22 11:39

ありがとうございます。特に問題はないということですね。
LouiS0616

2019/10/22 11:39

高評価数については当人に聞いてみないと何とも。 私自身は私の回答の方が特別優れているとは思っていません。
Zuishin

2019/10/22 11:41

私は回答に問題なければそれで大丈夫です。何か間違っていてもわからないので聞いてみました。
hermit19901127

2019/10/22 11:45

LouiS0616さんに高評価をいたしました… その理由ですが、質問主さんの以降として「N1、N2、N3...」と現時点で「ああ…質問主、これを増やすのであろうな…」という様子に対し LouiS0616さんの「可変長配列を使った関数」というソリューションが最も理解しやすい解答だなと思った次第です…。 もしかするとLouiS016さんの解答に問題があるかもしれないし Zuishinの解答にメモリ効率や処理速度的な利点がある可能性もあるかもしれませんが、 質問主が求めるソリューションとして「わかりやすい概念ではないのか」と思った次第です…。 ここは、デキるプログラマとしては歯がゆい次第だと思いますが、 初心者にとって求めるのはメモリ効率や処理速度より「概念的に分かりやすいか」が重要だと思う次第です…
LouiS0616

2019/10/22 11:46

一つだけ気になる点があるとしたらオートボクシングのオーバーヘッドくらいですが、実装を簡潔にするためには充分無視できる範囲かと思います。これを避けるとなると各プリミティブ型に対応したメソッドをいちいち用意しなければならないので...
hermit19901127

2019/10/22 11:48

質問主のデータを入力時点で適切に処理すれば、Zuisinさんの解決策に乗せたり等、効率のいいソリューションに持っていけると思えますが、 現状、「N1、N2、N3…」と無駄にint型が増えていくんだろうな…という現実を垣間見た結果、これに対応できるのがLouiS0616さんの手法が「現実的」だろうなと思った次第です。
Zuishin

2019/10/22 11:49

ジェネリクスを使ってもボックス化するというのが今ひとつ馴染めません。勉強しました。
Zuishin

2019/10/22 11:50

hermit19901127 さん、私の回答読んでないでしょう。
hermit19901127

2019/10/22 12:03

読んでないというより、質問主が求めてる解答に対して、貴殿の説明が、技巧がある上に処理速度やパフォーマンスの面で有利なのかもしれない印象はありますが、それ以前に 「これ、初心者が見て学びたい、または真似したいか?」という点で疑問に思った次第です…。 特に処理速度やパフォーマンス面の補足等が無い為、「なんか変態的なことをしているのだろう…」程度の印象しか抱けなかったです…。 そちらのプログラムに対する美学はあるかもしれませんが、個人的には 「ぱっと見が分かりやすいか」が大事だと思うのと、 それは、特にプログラムのプの字もわからない初心者さんであれば、なおさらだと思う次第です…
Zuishin

2019/10/22 12:33 編集

なるほど Stream は変態的で、それが書いてあるだけで初心者はアレルギーを起こすため、可変長引数が見えなくなるということがわかりました。 私の回答はこれに答えたものです。 > もし下記のようなif文よりシンプルな記法がありましたらご教示いただきたいです。
hermit19901127

2019/10/22 12:22

分かればZuishinさんのコードがコード量が少なく、もっとも理解できますが、 そもそも、このような質問をする初心者に対して 「よー分からんけどコピペしよw」みたいな学を重んじない適当な人であればまぁいいのですが、 「可変長変数」どころか「ジェネリック」、さらに「Stream」まで理解を求めるような概念は、さすがにハードルが重い印象です…。 アレルギーというかアレですが、嫌いな食べ物がある人に対して、ある程度の段階は必要と言う印象ですね…。今回の場合、「可変長引数」のみの理解が、 無駄に増える個別のint定数(個人的にはまずこれを管理しろという印象)に対して、関数の宣言方法程度で対応できるLouiS0616さんのシンプルなやり方が「最適」ではないですが「相応」なのだと思った次第です…
guest

0

こんなのはどうでしょうか。

Wandbox

Java

1import java.util.*; 2 3class Wandbox 4{ 5 public static void main(String[] args) 6 { 7 System.out.println(check(1, 1, 1)); // true 8 System.out.println(check(1, 2, 3, 4)); // false 9 } 10 11 @SafeVarargs 12 static <T> boolean check(T ... args) 13 { 14 return Arrays.stream(args).distinct().count() == 1; 15 } 16}

追記

ジェネリクスを使わないバージョン。

Wandbox(リンク先に実行結果があります)

Java

1import java.util.*; 2 3class Wandbox 4{ 5 public static void main(String[] args) 6 { 7 System.out.println(check(1, 1, 1)); // true 8 System.out.println(check(1, 2, 2, 1, 1, 1)); // false 9 System.out.println(check("abc", "abc", "abc")); // true 10 } 11 12 static boolean check(Object ... args) // 引数がいくつあっても配列として取得できる 13 { 14 return Arrays 15 .stream(args) // 可変長引数 args を Stream に変換 16 .distinct() // 重複した要素を削除([1, 2, 2, 1, 1, 1] → [1, 2]) 17 .count() == 1; // 残った要素数が一つであればすべて同じだったと判定 18 } 19}

Stream API について

Stream API は関数型プログラミングの手法を取り入れた、モダンで読みやすく堅牢なプログラミングを可能にする技術です。これからのプログラマーは必ずマスターしましょう。

むしろ、これが読めないと、今後は老害と呼ばれたり、人よりプログラミング効率が落ちたり仕事が減ったりと、困ったことになります。決して一部の人が誤解しているような、特殊な人が特殊な趣味で使うものではありませんし、新しすぎる尖った手法でもありません。Java 8 から存在し、ごくごく普通に使われているものです。

参考: Java 11 時代の Java プログラミングスタイルガイド - Qiita

極力 for 文を使用せず、Stream API によって処理する。

Java 8 での Stream API の出現によって for 文が活躍する機会はほとんどなくなった。Stream API の宣言的な記述はうまく使用すれば可読性が高く、パフォーマンスの観点からも優れるため、例外的な場面を除いてコレクション操作は Stream API によって行うのがよいだろう。

投稿2019/10/22 10:23

編集2019/10/22 16:17
Zuishin

総合スコア28669

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

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

LouiS0616

2019/10/22 10:31

ジェネリクスを使わずとも、Object... で受け取って充分では?
Zuishin

2019/10/22 10:35

ジェネリクスを使っても Object になるんですね。C# であれば check(1, "abc") のように違う型の引数を渡すとコンパイルエラーにしてくれるので。 それなら Object でもいいと思います。
Zuishin

2019/10/22 15:43

ジェネリクスを使わないコードにコメントを入れ、また Stream API について追記しました。 引用しているのは Qiita の記事で、公式のものではありません。読まれた方が自分で判断してください。
guest

0

入出力部分で、どうデータを整形するにもよりますが…

Java

1 int N1 = 10; 2 int N2 = 10; 3 int N3 = 10; 4 5 int[] ia = new int[] { N1 , N2 , N3 } ; 6 7 boolean allEqual = true ; 8 9 for ( int i = 0 ; i < ia.length ; i++ ) 10 { 11 if( ia[i] != N1 ) { allEqual = false ; break ; } 12 } 13 14 System.out.println( allEqual );

こう記述すれば、N4,N5と増えようが、iaに追加し、
N1を基準として、1つでも違うデータがあれば、allEqualがfalseを返すと思います…

投稿2019/10/22 10:00

hermit19901127

総合スコア368

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

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

0

Streamを使うにしても、「すべて等しい」ならこっちの書き方のほうが自然だと思います。

java

1public static boolean allSame(int... values) { 2 if(values.length == 0) { 3 return true; // ここは要件次第 4 } 5 return IntStream.of(values).allMatch(v -> v == values[0]); 6}

なお、一般の型に対してはnullセーフも考えて

java

1public static boolean allSame(Object... values) { 2 if(values.length == 0) { 3 return true; // ここは要件次第 4 } 5 return Stream.of(values).allMatch(v -> Objects.equals(v, values[0])); 6}

投稿2019/10/25 02:15

swordone

総合スコア20669

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

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

Zuishin

2019/10/25 02:18

> もし下記のようなif文よりシンプルな記法がありましたらご教示いただきたいです。 という質問のはずだったので。
guest

0

問題が有ったので削除しました。申し訳ないm(")M

投稿2019/10/22 09:50

編集2019/10/22 09:56
cateye

総合スコア6851

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問