2017-04-11 11 views
0

複数のステータスが列挙型に格納されています。列挙型に基づいて列挙型カテゴリを作成します。

public enum Status { 
    IS_A("isA"), 
    IS_B("isB"), 
    FP_ERR("fp_err"), 
    FP_BLAH("fp_blah"), 
    CORRECT("correct") 

    private final String value; 

    Status(String value) { 
     this.value = value; 
    } 
} 

次のように、ステータスenumクラスを変更せずに、これらのステータスに基づいてカテゴリを作成したいと考えています。

public enum Category { 
    CategoryA("CategoryA",Status.IS_A, Status.IS_B), 
    CategoryB("CategoryB",Status.FP_ERR, Status.FP_BLAH). 
    CategoryC("CategoryC",Status.Correct); 

    private List<Status> status; 
    private String category; 

    private static final Map<Status, String> VALUE_MAP = Stream.of(Category.values()) 

    Category(String category, Status ... status) { 
     this.status = Arrays.asList(status); 
     this.category = category; 
    } 

    public static String getCategory(Status status) { 
     //Retrun category based on Status type 
     String category = VALUE_MAP.get(status); 
     return category; 
    } 
} 

私はあなたがすべてでVALUE_MAPを必要としないマップVALUE_MAP

答えて

2

あなたはstaticブロックにあなたの初期設定を変更する場合は、あなたがこれを行うことができます:

private static final EnumMap<Status, String> VALUE_MAP = new EnumMap<>(Status.class); 
static { 
    Arrays.stream(Category.values()).forEach(category -> { 
     category.status.forEach(status -> { 
      VALUE_MAP.put(status, category.category); 
     }); 
    }); 
} 
+0

'HashMap'ではなく' EnumMap'を使うべきです。そうでなければ、素晴らしい提案です。 –

+0

まず 'forEach'を使わないで解決策を見つけようとします。新しいEnumMap <>(Status.class)、(m、c) - > c.status.forEach()このクラスは、 s-> m.put(s、c.category))、Map :: putAll); ' – Holger

2

でその状態で各カテゴリの値を格納する方法を見つけ出すことができないのです。 Statusによってcategoryを取得する場合、あなただけのすべてのCategory.values()を通過し、要求されたStatusが含まれているものを見つける必要があります。

public static String getCategory(Status status) { 
    for (Category category : values()) { 
     if (category.status.contains(status)) { 
      return category.category; 
     } 
    } 
    return null; 
} 
+1

これは 'Map'を使うよりも効率が悪いです。 –

+2

いいえ、列挙型に3つの値しかない場合。 –

+0

'Map'が' HashMap'である場合、効率の違いは分かりませんが、何らかの理由で 'enumMap'の存在を無視して、' enum'キーを値にマッピングするように設計されているネストされたループよりも効率的です( 'List'の' contains 'は線形検索です)... – Holger