お世話になっております。
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答5件
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
総合スコア20677
0
こんなのはどうでしょうか。
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総合スコア0
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総合スコア35682
2019/10/22 10:14
2019/10/22 10:29
2019/10/22 11:16
2019/10/22 11:39
2019/10/22 11:41
2019/10/22 11:45
2019/10/22 11:48
2019/10/22 11:49
2019/10/22 11:50
2019/10/22 12:03
2019/10/22 12:33 編集
2019/10/22 12:22
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
総合スコア368
0
問題が有ったので削除しました。申し訳ないm(")M
投稿2019/10/22 09:50
編集2019/10/22 09:56総合スコア6851
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
2019/10/25 02:18