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

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

ただいまの
回答率

90.35%

  • Java

    15062questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 329

Udomomo

score 1393

あるパラメータが特定の数値でない場合のみ、処理を分けたいと思っています。
通常であれば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文の中に条件を書き足すことになり、定数を追加するときに手間がかかります。
なにか良い書き方はあるでしょうか?あるいは、このような場合は定数クラスを使わない方が書きやすいでしょうか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+3

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

public static void main(String[] args){
    System.out.println(SafeNum.isSafe(1234)); // true
    System.out.println(SafeNum.isSafe(1235)); // false
}

enum SafeNum {
    NUM_A(1234),
    NUM_B(5678);

    public final int num;

    private SafeNum(int num) {
        this.num = num;
    }

    // 定数を追加してもこのメソッドは変更不要
    public static boolean isSafe(int value) {
        return Arrays.stream(SafeNum.values()).anyMatch(p -> p.num == value);
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/15 14:37 編集

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

    キャンセル

0

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

Set<Integer> set = new HashSet<>(Arrays.asList(1234, 5678, ...));

set.contains(testNum);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/12 10:53

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

    キャンセル

  • 2018/04/12 11:10

    すいません、Javaの性能的なところまでは考慮していませんでした。

    ただ今のソースからすると、
    2000も3000も定数が増えることはないと思うので、
    そう大差ないかと。
    それが1秒間に1万回呼ばれるような特殊なものでなければ。

    ちなみにですが、
    どのくらいの件数や呼び出し回数から性能的な誤差が出てくるイメージでしょうか?
    マシンスペックに左右されると思っていますが、感覚的なものでも教えていただければ。

    キャンセル

-2

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

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

// int型の値をいれる集合(HashSet)のオブジェクト set を作ります。
Set<int> set = new HashSet<int>();

// set に特定の数値を追加してゆきます。
set.add(1234);
set.add(5678);
// 同じように、特定の数値を全部、集合 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 10:35

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

    キャンセル

同じタグがついた質問を見る

  • Java

    15062questions

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