2013-10-01 104 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(); 
    } 
}