2013-10-01 120 views
1

所以,我知道你不能在case語句中使用變量。我希望有人能夠指出我的代碼作爲替代品是非常有效的。 (例如,我可以做一堆ifs)。Java在case語句中使用變量

情況是我有一個對象數據的數組,我想遍歷該數組。數組中的位置由如下所示的名稱給出(int ... ordinal語句)。基本上我必須爲數組的某些成員(如果它們是離散數據,如C_VENT_RATE)分配生成'結果'對象。我可以很容易地看到這一點的唯一方法是做一堆如if(如quals(pr_int))的ifs。

ArrayList<String[]> rawEKGs = ekgFile.getForMrno(docInfo.getMedicalRecordNumber()); 

    for (String[] parts : rawEKGs) { 
    for (int i=0; i< parts.length; i++) 
    { 
     Result result = docInfo.getResult(); 
     boolean process = true; 
     final int vent_rate = UncEKG.COL_NAMES.C_VENT_RATE.ordinal(); 
     int art_rate = UncEKG.COL_NAMES.C_ART_RATE.ordinal(); 
     int pr_int = UncEKG.COL_NAMES.C_PR_INTERVAL.ordinal(); 
     int qrs_dur = UncEKG.COL_NAMES.C_QRS_DURATION.ordinal(); 
     int qt_qtc = UncEKG.COL_NAMES.C_QT_QTC.ordinal(); 
     int prt = UncEKG.COL_NAMES.C_PRT_AXES.ordinal(); 


     switch(i) { 
     case : // something 
      break; 
     default: process = false; 
     } 
+0

在早期版本的Java語言中,case語句的值必須是文字/常量整數。我知道限制已經在更新的版本中被放寬,但我不知道細節。 –

+0

如果您知道可能的案例值範圍很窄(可能是幾十個),您可以使用映射數組來映射您的索引值和您定義的「常量」。然而,不確定是否值得付出努力,而不是僅僅使用if梯子。 –

+0

所以你知道數組中的數據的索引,你必須處理(從枚舉的序數值)?爲什麼你不能通過該索引訪問數據:'String data = parts [i]; doSomeThingWithData(數據); ......而不是遍歷整個數組,並且如果你發現一個有趣的部分,就要採取行動。 – Pyranja

回答

1

我認爲正確的方法是把邏輯放在枚舉中。所以你可以在enum類中添加一個靜態方法來獲得基於int的正確列,然後你可以根據枚舉進行切換,或者做一些其他的事情,或者更好的方法是在枚舉上使用方法,列是否被處理(儘管如果枚舉更通用,這可能不合適)。

快速和骯髒的應該是這樣的,雖然:

ArrayList<String[]> rawEKGs = ekgFile.getForMrno(docInfo.getMedicalRecordNumber()); 
UncEKG.COL_NAMES[] values = UncEKG.COL_NAMES.values(); 
for (String[] parts : rawEKGs) { 
    for (int i=0; i< parts.length; i++) 
    { 
     Result result = docInfo.getResult(); 
     boolean process = true; 
     switch (values[i]) { 
      case UncEKG.COL_NAMES.C_VENT_RATE: 
       break; 
      default: process = false; 
     } 
    } 
} 
+0

這是完美的,正是我想要的。確認它的工作。謝謝大家。 – Rob

1

不喜歡這種方式

switch(i) { 
     case 0: // something 
      break; 
     case 1: // something 
      break; 
     case 2: // something 
      break; 
     . 
     . 
     . 
     . 
     default: process = false; 
     } 
+0

這個我沒有說明的問題是我們想變得靈活。源代碼是一個CSV文件,我們希望允許用戶圍繞列移動,所以如果他們這樣做,這將失敗。 – Rob

1

如果對象包含一個枚舉(UncEKG)作爲變量,爲什麼不直接使用在枚舉

switch (theEnum) { 
    case UncEKG.COL_NAMES.C_VENT_RATE: 
     //something 
     break; 
    case UncEKG.COL_NAMES.C_PR_INTERVAL: 
     //something else 
     break; 
    default: process = false 
} 

Enum info

開關
4

既然你已經有一個枚舉,你可以嘗試使用EnumMap的您枚舉映射到的命令Command模式。

每個Command實例將與您的一個case語句的邏輯相同。

EnumMap<UncEKG.COL_NAMES, Command> map = ... 
//values is in ordinal order 
//pulled out for performance reasons 
UncEKG.COL_NAMES[] names = UncEKG.COL_NAMES.values(); 
for (String[] parts : rawEKGs) { 
    for (int i=0; i< parts.length; i++){ 
     map.get(names[i]).execute(); 
    } 
}