【问题标题】:How can I set an enum with an if-statement or a for-loop?如何使用 if 语句或 for 循环设置枚举?
【发布时间】:2017-08-03 10:58:04
【问题描述】:

我希望人们能够评估自己。为此,他们需要输入一个介于 0 和 10 之间的数字(0、1、2、3、4、5、6、7、8、9、10)。根据他们的数量,我的枚举应该切换。

我的枚举称为“knowlede”,我得到了四个不同的“knowledge”步骤。
0-3 = 初学者 // 4-6 = 高级 // 7-9 = 专业 // 10 = 大师

我的想法是使用 if 语句和/或 for 循环设置用户枚举级别。
到目前为止,这是我的代码,但如您所见,我可以缩短此代码,但我不知道如何;我阅读了其他一些主题,但由于某种原因它们不起作用或者我没有得到它们。

@SuppressLint("SetTextI18n")
public Wissenstand Bestätigung(View v) {
    TextView uWissen = (TextView) findViewById(R.id.textView_Wissen_Titel);
    TextView pWarung = (TextView) findViewById(R.id.textView_Wissen);
    TextView eWissen = (TextView) findViewById(R.id.editText_eingabeWissentsstand);
            if ("0".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.Beginner;
            } else if ("1".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.Beginner;
            } else if ("2".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.Beginner;
            } else if ("3".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.Beginner;
            } else if ("4".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.Fortgeschrittener;
            } else if ("5".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.Fortgeschrittener;
            } else if ("6".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.Fortgeschrittener;
            } else if ("7".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.Pro;
            } else if ("8".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.Pro;
            } else if ("9".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.Pro;
            } else if ("10".equals(eWissen.getText().toString())) {
                knowledge = Wissenstand.GrandMaster;
            } else {
                uWissen.setText("Fehler gefunden!");
                uWissen.getResources().getColor(android.R.color.holo_red_dark);
                pWarung.setText("Gib eine Zahl von 0 bis 10 ein!\n0,5-er Schritte sind nicht erlaubt!\nWeitere Informationen kannst du der Legende entnehmen!");
                pWarung.getResources().getColor(android.R.color.holo_red_light);
            }
    return null;
}

如果您因为不懂某些单词而需要帮助,请给我发短信,我会尽快回复。
语言是“德语”。

【问题讨论】:

  • 您也可以将String 解析为int 并据此进行检查。例如。 if (in < 4){k = Beginner}else if(in < 7){k = Intermediate} else { k = Master}

标签: java android-studio for-loop if-statement enums


【解决方案1】:

我会这样实现:

enum KnowledgeLevel
{
    BEGINNER, ADVANCED, PROFESSIONAL, MASTER;

    static KnowledgeLevel fromUserInput(final int input)
    {
        if (input >= 10) {
            return MASTER;
        }
        else if (input >= 7) {
            return PROFESSIONAL;
        }
        else if (input >= 4) {
            return ADVANCED;
        }
        else {
            return BEGINNER;
        }
    }
}

示例用法如下:

final String input = "5";
KnowledgeLevel level = KnowledgeLevel.fromUserInput( Integer.parseInt(input) );

与您的实现相比,这有一些优势:

  1. 重复次数较少,因为我使用了范围 >= 而不是明确提及所有整数
  2. 它将接收用户输入和将其转换为知识级别的关注点分开。
  3. 它将整数到级别的映射放置在易于重复使用的位置。

【讨论】:

  • 现在有一个错误“fromUserInput is never used”。那么这是我的检查按钮应该有的方法吗?我希望editText旁边的按钮检查editText上的输入,然后根据editText中的数字设置知识。此外,我不能使用“findViewById”,这导致我可以在我的 textViews 上使用“setText”。
  • 不使用方法不是错误。这只是一个警告。但是,是的,当他们按下按钮时使用KnowledgeLevel.fromUserInput
  • 不幸的是,我不确定如何在我的代码中执行此操作。我创建了一个名为“fromUsersInput”的新方法,并且选中按钮获得了 onClickMethod“fromUsersInput”,但是在您给我的代码中它仍然“从未使用过”。而且我不知道如何将editText中的文字提供给您的方法,因为只有这样我的枚举才会设置,对吧?
  • 没有看到我帮不了你。随时使用更新的代码发布新问题。
  • 这是一个新的/更新的代码。 stackoverflow.com/questions/45484272/…
【解决方案2】:

您可以使用 Map 存储评级到枚举值的映射:

Map<String, Wissenstand> ratingToWissenstand = new HashMap<>();

ratingToWissenstand.put("0", Wissenstand.Beginner);
ratingToWissenstand.put("1", Wissenstand.Beginner);
ratingToWissenstand.put("2", Wissenstand.Beginner);
ratingToWissenstand.put("3", Wissenstand.Beginner);
ratingToWissenstand.put("4", Wissenstand.Fortgeschrittener);
ratingToWissenstand.put("5", Wissenstand.Fortgeschrittener);
ratingToWissenstand.put("6", Wissenstand.Fortgeschrittener);
ratingToWissenstand.put("7", Wissenstand.Pro);
ratingToWissenstand.put("8", Wissenstand.Pro);
ratingToWissenstand.put("9", Wissenstand.Pro);
ratingToWissenstand.put("10", Wissenstand.GrandMaster);

knowledge = ratingToWissenstand.get(eWissen.getText().toString());
if (knowledge == null) {
    // Handle invalid eWissen-text value
}

可以将地图设为静态字段并仅初始化一次。那么你的代码中就只有get-Call。

【讨论】:

    【解决方案3】:

    试试下面这样的伪代码。 您定义了一个数组,其中包含 knowledge 的所有可能答案。 然后,您验证选项是适当范围 1-10 中的数字。 最后,如果所选选项在适当的范围内,则从数组或其他条件中分配 knowledge

    Wissenstand knowledges[] ={ Wissenstand.Beginner,Wissenstand.Beginner,Wissenstand.Beginner,Wissenstand.Beginner,Wissenstand.Fortgeschrittener,Wissenstand.Fortgeschrittener,Wissenstand.Fortgeschrittener,Wissenstand.Pro,Wissenstand.Pro,Wissenstand.GrandMaster};
    
    int option = -1;
    try{
        option=Integer.getInt(eWissen.getText().toString()); 
    }
    catch(Exception e){
    }
    if (option>0 && option <=knowledge.size()){
        knowledge=knowledges[option];
    }
    else{
        uWissen.setText("Fehler gefunden!");
        uWissen.getResources().getColor(android.R.color.holo_red_dark);
                    pWarung.setText("Gib eine Zahl von 0 bis 10 ein!\n0,5-er Schritte sind nicht erlaubt!\nWeitere Informationen kannst du der Legende entnehmen!");
        pWarung.getResources().getColor(android.R.color.holo_red_light);
    }
    

    【讨论】:

      【解决方案4】:
      int value = Integer.parseInt(eWissen.getText().toString());
      if(value < 4){
          knowledge = Wissenstand.Beginner;
      }else if(value < 7){
          knowledge = Wissenstand.Fortgeschrittener;
      }else if(value < 10){
          knowledge = Wissenstand.Pro;
      }else{
          knowledge = Wissenstand.GrandMaster;
      }
      

      【讨论】:

      • 仅供参考,Integer.valueOf 返回一个已装箱的 Integer,您会立即再次将其拆箱。一个非常小的优化是使用parseInt
      • @Michael 干得好!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多