【发布时间】:2017-01-12 01:06:59
【问题描述】:
我在这里找不到像这样的先前问题(这让我感到惊讶),所以..
我有一个有效的 Java 程序,其中一部分分析键入的输入。一些输入“选项”是以下情况下的字符串。
switch (varName.toLowerCase()) {
case "steps":
common.steps = true;
break;
case "scale":
common.scale = true;
break;
case "float":
common.fracts = false;
break;
case "fraction":
common.fracts = true;
break;
case "spaces":
common.spaces = false;
break;
... etc.
}
在 C 或 C++ 中,我可以通过创建一个列表(它是一个包含字符串名称和变量指针的结构)来缩短这段代码,例如
LIST varAction[] = { { "steps", &common.steps },
{ "scale", &common.scale },
.. etc.
};
然后简单地检查 i = 0 到列表大小的循环
if ( strcmp(varAction[i].name, input) == 0) {
*varAction[i].pointer = condition;
}
Java 切换不止一次,是维护问题,所以我想要更好的方法。
我可以使用字符串的散列在数组中使用散列索引,但这会阻止我根据需要通过代码使用特定的变量名,从而使该代码不太清晰......即我不想要做(伪代码)
hashTable[varName] instead of (for example)
if ( common.fracts )
{ do something }
一定有更好的方法吗?有没有?提前致谢。
【问题讨论】:
-
我错过了什么吗?在我看来,'Map
` 会完成你想要的。使用 HashMap 来实现。 -
@OleV.V.:这也是我的反应,但是 OP 说他/她不想在他/她提到这些属性的任何地方都使用字符串
-
FWIW,您通常可以使用多态性或按合同设计(接口)来解决对开关的需求,以封装您的开关语句正在执行的任何操作。这样,行为是对象类型所固有的,然后问题就减少到选择正确的具体类来实例化。
-
@AndrewC - 是的,我在这里的某个地方暗示过。对其他东西进行新设计是个好主意,但对于这个来说工作量太大了。感谢您的澄清。
标签: java c++ arrays hash switch-statement