所以,我知道你不能在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;
}
答案 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
}
答案 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;
}
}
}