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

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

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

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

Q&A

解決済

4回答

1939閲覧

その値が定数群に含まれているか判定する処理の書き方

Udomomo

総合スコア1524

Java

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

0グッド

1クリップ

投稿2018/04/12 00:39

編集2018/04/12 00:40

あるパラメータが特定の数値でない場合のみ、処理を分けたいと思っています。
通常であればif文の中で条件を書くのですが、今回の場合は「特定の数値」が数多くあるうえ、mainの処理内でこの条件分岐を行う箇所が多いので、
定数の管理とそれに付随するメソッドを持つ新しいクラスを作り、if (isSafe) {...}のように書くことができればと思っています。

public class ValidationUtil { public static class SafeNum { //管理すべき定数(実際は20個ほどある) public static final int NUM_A = 1234; public static final int NUM_B = 5678; } public static boolean isSafe(int testNum) { if (testNum == SafeNum.NUM_A || testNum == safeNum.NUM_B) { return true; } else { return false; } } }

上記のように定数クラスとメソッドという形で切り出してみたのですが、これだと結局if文の中に条件を書き足すことになり、定数を追加するときに手間がかかります。
なにか良い書き方はあるでしょうか?あるいは、このような場合は定数クラスを使わない方が書きやすいでしょうか。

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

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

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

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

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

guest

回答4

0

ベストアンサー

定数ならenumにすると追加が簡単にできますよ。

Java

1public static void main(String[] args){ 2 System.out.println(SafeNum.isSafe(1234)); // true 3 System.out.println(SafeNum.isSafe(1235)); // false 4} 5 6enum SafeNum { 7 NUM_A(1234), 8 NUM_B(5678); 9 10 public final int num; 11 12 private SafeNum(int num) { 13 this.num = num; 14 } 15 16 // 定数を追加してもこのメソッドは変更不要 17 public static boolean isSafe(int value) { 18 return Arrays.stream(SafeNum.values()).anyMatch(p -> p.num == value); 19 } 20}

投稿2018/04/12 01:28

YamakawaJunichi

総合スコア630

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

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

Udomomo

2018/04/15 05:37 編集

enumの使い方はまだあまりマスターできていませんでした。改めて学習します。 Java 8以降の構文も入っていて参考になります。
guest

0

Collectionでもコト足りるような気がします。
インスタンスはほぼ一緒ですが。。。

Java

1 private static Collection<Integer> c = Arrays.asList(12,123,1234); 2 public static boolean isSafe(int testNum) { 3 return c.contains(testNum); 4 }

書き方というよりは、設計になりますが、
DBやpropertyファイルなどに定数を持たせることで、
ソースを改修せずに挙動を変えることができます。

システム的に利用しているだけであれば、定数クラス(Java)。
業務的に利用しているのであれば、外部ストレージ(DB、ファイル)。

投稿2018/04/12 01:51

szk.

総合スコア1400

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

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

swordone

2018/04/12 01:53

事足りるけど、数が多くなった場合に検索のスピードが変わる 実体がListだと線形探索になるからO(n)だけど、 HashSetなら一定時間のO(1)で済む
szk.

2018/04/12 02:10

すいません、Javaの性能的なところまでは考慮していませんでした。 ただ今のソースからすると、 2000も3000も定数が増えることはないと思うので、 そう大差ないかと。 それが1秒間に1万回呼ばれるような特殊なものでなければ。 ちなみにですが、 どのくらいの件数や呼び出し回数から性能的な誤差が出てくるイメージでしょうか? マシンスペックに左右されると思っていますが、感覚的なものでも教えていただければ。
guest

0

データ(特定の数値)の個数が一定でないのなら、特定の数値の集合(HashSet)を使うのが良いのではないでしょうか。

特定の数値の集合をつくるところは

Java

1// int型の値をいれる集合(HashSet)のオブジェクト set を作ります。 2Set<int> set = new HashSet<int>(); 3 4// set に特定の数値を追加してゆきます。 5set.add(1234); 6set.add(5678); 7// 同じように、特定の数値を全部、集合 set に追加してください

というような感じ。 特定の数値の個数だけ、set.addを行います。

そして、集合 setを使うように修正した isSafeは、

public static boolean isSafe(int testNum) { for(Iterator it = set.iterator(); it.hasNext(); ) { if(testNum = it.next()){ // 特定の数値の一つと一致した return true; } // 全部の特定の数値と比較したが、一致しなかった。 return false; }

投稿2018/04/12 01:28

coco_bauer

総合スコア6915

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

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

swordone

2018/04/12 01:35

少なくとも現段階でジェネリクスにプリミティブのintは使えないし、 Set使っているのにわざわざIterator使うのは無駄。
guest

0

Setを使うのはどうでしょう?

java

1Set<Integer> set = new HashSet<>(Arrays.asList(1234, 5678, ...)); 2 3set.contains(testNum);

投稿2018/04/12 01:08

swordone

総合スコア20649

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問