2012-06-14 36 views
5

在我的應用程序中,如果輸入匹配某些特定的20個條目,我需要分支。複雜if()或枚舉?

我想用一個枚舉

public enum dateRule { is_on, is_not_on, is_before,...} 

,並在枚舉常量的開關做了功能

switch(dateRule.valueOf(input)) 
{ 
    case is_on : 
    case is_not_on : 
    case is_before : 
    . 
    . 
    . 
    // function() 
    break; 
} 

但輸入的字符串會像「是」,「不是的在'之前','之前'等,而不是在詞之間。 我知道一個枚舉不能有包含空間的常量。

可能的方法,我可以讓出:

1,使用if語句來比較輸入發出長長的if語句像

if(input.equals("is on") || 
    input.equals("is not on") || 
    input.equals("is before") ...) { // function() } 

2,工作20級可能的輸入插入_字之間但是即使其他輸入字符串不在20之下也可以有多個單詞。

有沒有更好的實現方法?

+0

在Java 7中,您可以打開一個字符串。 –

回答

0

感謝您的建議。他們在這裏引導我。

這與其他答案几乎相同,只是簡單一點。

總之,我需要輸入字符串與一組20串和

如果匹配,做一些事情進行比較。否則,做別的事。

串的靜態集合到哪個輸入需要進行比較: 是上,不上,是之前,是經過等20個條目

我創建一個枚舉

public enum dateRules 
{ 
    is_on 
    ,is_not_on 
    ,is_before 
    ,is_after 
    . 
    . 
    . 
} 

和開關上輸入

if(isARule(in = input.replace(" ","_")) 
{ 
    switch(dateRule.valueOf(in)) 
    { 
     case is_on, 
     case is_not_on, 
     case is_before, ... 
    } 
} 

的格式的值I「輸入」的格式的值複製「中」與「」的「_」,這樣我可以在不重複使用的另一替換輸入。

private static boolean isARule(String value) 
    { 
    for(dateRule rule : dateRule.values()) 
    { 
     if(rule.toString().equals(value)) 
     { 
     return true; 
     } 
    } 
    return false; 
    } 

問題解決了。

參考:https://stackoverflow.com/a/4936895/1297564

1

如果您使用的是Java 7,你也可以在這裏選擇了中間路線,並做了switch語句字符串:

switch (input) { 
    case "is on": 
     // do stuff 
     break; 
    case "is not on": 
     // etc 
} 
+3

僅限於java 7+ –

+0

感謝您的信息。肯定會在未來的某個時候幫助我。 :) – aradhak

0

你沒有真正打破了概念足夠的,這兩個解決方案脆...

看看你的語法

「是」,可以刪除,似乎是無處不在的

「不」,可選,適用!輸出比較

上,之前,之後,應用比較。

所以做一個空格之間的分割。解析分詞以確保它們存在於語法定義中,然後逐步評估傳入的表達式。這將允許您輕鬆擴展語法(不必添加「is」和「is not」 「對於每一個組合,並保持你的代碼易於閱讀。

有被改寫的到一個switch語句的目的,多個條件導致巨大的膨脹一段時間。

3

這是可以從價值單獨枚舉標識。類似這樣的:

public enum MyEnumType 
{ 
    IS_BEFORE("is before"), 
    IS_ON("is on"), 
    IS_NOT_ON("is not on") 

    public final String value; 

    MyEnumType(final String value) 
    { 
     this.value = value; 
    } 
} 

你也可以向枚舉類型添加方法(該方法可以有argum已廢除爲好),這樣的事情:

public boolean isOnOrNotOn() 
{ 
    return (this.value.contentEquals(IS_ON) || this.value.contentEquals(IS_NOT_ON)); 
} 

使用的開關:

switch(dateRule.valueOf(input)) 
{ 
    case IS_ON: ... 
    case IS_NOT_ON: ... 
    case IS_BEFORE: ... 
} 

當你得到IS_ON的價值例如像System.out.println(IS_ON)它會顯示is on

+0

我得到dateRule()dateRule()中的錯誤不能應用於(java.lang.String)'。 IDE建議是定義一個構造函數。 – aradhak

+0

@Student然後,這也是我的建議:)對不起,我只發佈了部分代碼。我現在增加了一些。 –

+0

謝謝!現在沒有更多的錯誤。 :)但是我在'System.out.println(is_on);' – aradhak

3

你可以在枚舉中定義你自己的valueOf方法(不要叫它valueOf)。

public enum State { 
    IS_ON, 
    IS_OFF; 

    public static State translate(String value) { 
     return valueOf(value.toUpperCase().replace(' ', '_')); 
    } 
} 

就像以前一樣使用它。

State state = State.translate("is on"); 

早期的switch語句仍然可以工作。

+0

從這裏開始,並進一步簡化了我發佈的解決方案中的控制流程。學到了很多東西。謝謝。 :) – aradhak