Java在case语句中使用变量

Java在case语句中使用变量,java,Java,所以,我知道不能在case语句中使用变量。我希望有人能给我指出一些代码,作为替代,这些代码会相当有效。例如,我可以做很多假设 情况是,我有一个对象数据数组,我想遍历该数组。数组中的位置由如下int…ordinal语句所示的名称给出。基本上,如果数组的某些成员是离散数据(如C_VENT_RATE),我必须为它们分配生成“结果”对象。我能很容易看出这一点的唯一方法是做一系列的if,比如if I.equalspr\u int ArrayList<String[]> rawEKGs =

所以,我知道不能在case语句中使用变量。我希望有人能给我指出一些代码,作为替代,这些代码会相当有效。例如,我可以做很多假设

情况是,我有一个对象数据数组,我想遍历该数组。数组中的位置由如下int…ordinal语句所示的名称给出。基本上,如果数组的某些成员是离散数据(如C_VENT_RATE),我必须为它们分配生成“结果”对象。我能很容易看出这一点的唯一方法是做一系列的if,比如if I.equalspr\u 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;
      }
你喜欢这样吗

    switch(i) {
        case 0: // something
          break;
        case 1: // something
          break;
        case 2: // something
          break;
         .
         .
         .
         .
        default: process = false;
      }
你喜欢这样吗

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

如果对象包含枚举作为变量,为什么不使用枚举上的开关呢

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

如果对象包含枚举作为变量,为什么不使用枚举上的开关

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类添加一个静态方法,以获得基于int的正确列,然后您可以基于enum进行切换,或者执行其他操作,或者更好地在enum上有一个方法,该方法说明是否处理该列,尽管如果enum更通用,这可能不合适

尽管如此,快速和肮脏看起来是这样的:

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

我认为正确的方法是将逻辑放入枚举中。因此,您可以向enum类添加一个静态方法,以获得基于int的正确列,然后您可以基于enum进行切换,或者执行其他操作,或者更好地在enum上有一个方法,该方法说明是否处理该列,尽管如果enum更通用,这可能不合适

尽管如此,快速和肮脏看起来是这样的:

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

因为您已经有了一个枚举,所以可以使用将枚举映射到命令的枚举映射来尝试命令模式

每个命令实例的逻辑都与您的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();
    }
}

因为您已经有了一个枚举,所以可以使用将枚举映射到命令的枚举映射来尝试命令模式

每个命令实例的逻辑都与您的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();
    }
}

在Java语言的早期版本中,case语句上的值必须是文字/常量整数。我知道最近的版本放宽了限制,但我不知道细节。如果您知道可能的大小写值在几十个窄范围内,也许您可以使用映射数组在索引值和您定义的常量之间进行映射。不过,与仅使用if梯形图相比,不确定这是否值得付出努力。因此,您知道数组中数据的索引,必须从枚举的序数值进行处理?为什么不能通过该索引访问数据:stringdata=parts[i];doSomeThingWithDatadata。。。在Java语言的早期版本中,case语句上的值必须是一个文本/常量整数。我知道最近的版本放宽了限制,但我不知道细节。如果您知道可能的大小写值在几十个窄范围内,也许您可以使用映射数组在索引值和您定义的常量之间进行映射。不过,与仅使用if梯形图相比,不确定这是否值得付出努力。因此,您知道数组中数据的索引,必须从枚举的序数值进行处理?为什么不能通过该索引访问数据:stringdata=parts[i];doSomeThingWithDatadata。。。如果你发现了一个有趣的部分,就不要遍历整个数组并采取行动,问题是我们想要灵活,我没有解释。源文件是一个CSV文件,我们希望允许用户在列之间移动,因此如果他们这样做,这将失败。我没有说明的问题是,我们希望灵活。源文件是一个CSV文件,我们希望允许用户在列中移动,因此如果他们这样做,这将失败。这是完美的,正是我想要的。确认它有效。谢谢大家。这太完美了,正是我想要的。确认它有效。谢谢大家。