Java在case语句中使用变量

时间:2013-10-01 20:46:37

标签: java

所以,我知道你不能在case语句中使用变量。我希望有人能指出我作为替代品相当有效的代码。 (例如,我可以做一堆ifs。)

情况是我有一个对象数据数组,我想迭代该数组。数组中的位置由名称给出,如下所示(int ... ordinal语句)。基本上我必须为数组的某些成员分配生成'结果'对象(如果它们是离散数据,如C_VENT_RATE)。我可以很容易地看到这一点的唯一方法是做一堆ifs,如if(i.equals(pr_int))。

  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;
      }

4 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:1)

这样做

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

答案 2 :(得分: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

答案 3 :(得分: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;
       }
    }
 }