从分隔字符串构建对象的最佳方法(希望不是循环的情况)

时间:2009-03-31 13:12:20

标签: string parsing loops switch-statement

这个问题感觉好像已经被问到了,但我没有找到任何东西,所以这里......

我有一个构造函数,它被传递一个被分隔的字符串。从该字符串我需要填充对象的实例变量。我可以通过分隔符轻松拆分字符串以给我一个字符串数组。我知道我可以简单地遍历数组并使用ifs或基于当前数组索引的switch / case语句设置我的实例变量 - 但是这感觉有点讨厌。伪代码:

String[] tokens = <from generic string tokenizer>;

for (int i = 0;i < tokens.length;i++) {
   switch(i) {
      case(0): instanceVariableA = tokens[i];
      case(1): instanceVarliableB = tokens[i];
      ...
   }
}

有没有人对我如何做得更好/更好有任何想法?

对于它的价值,我在Java工作,但我想这是语言独立。

5 个答案:

答案 0 :(得分:4)

嗯......“讨厌的”是构造函数处理参数的方式。如果你无法改变它,那么你的代码片段就像它可能一样好。

你可以摆脱for循环,但是......

instanceVariableA = tokens[0];
instanceVariableB = tokens[1];

然后引入常量(for readibilty):

instanceVariableA = tokens[VARIABLE_A_INDEX];
instanceVariableB = tokens[VARIABLE_B_INDEX];

注意:如果你可以改变字符串参数语法,你可以引入一个简单的解析器,并且稍微反思一下,以稍微优雅的方式处理这个东西:

String inputString = "instanceVariableA=some_stuff|instanceVariableB=some other stuff";
String[] tokens = inputString.split("|");
for (String token : tokens)
{
    String[] elements = token.split("=");
    String propertyName = tokens[0];
    String propertyValue = tokens[1];
    invokeSetter(this, propertyName, propertyValue); // TODO write method
}

答案 1 :(得分:0)

你能不能使用“for-each”循环消除大部分混乱?

答案 2 :(得分:0)

我真的认为你这样做的方式很好,Manrico对使用常量也提出了很好的建议。

另一种方法是使用整数键和字符串值创建HashMap,其中键是索引,值是属性的名称。然后,您可以使用简单的循环和一些反射来设置属性。反射部分可能会使这有点慢,但在另一种语言(例如,PHP)中,这将更加清晰。

答案 3 :(得分:0)

特定于Python的解决方案:

我们说params = ["instanceVariableA", "instanceVariableB"]。然后:

self.__dict__.update(dict(zip(params, tokens)))

应该工作;这大致相当于

for k,v in zip(params, tokens):
    setAttr(self, k, v)

取决于访问者的存在/不存在。

在非动态语言中,您可以实现构建从字符串到某种类型的引用/访问器的映射的相同效果。

(还要注意当列表用完时zip停止。)

答案 4 :(得分:0)

只是一个未经考验的想法,

保留原始令牌......

String[] tokens = <from generic string tokenizer>;

然后创建

int instanceVariableA = 0;
int instanceVariableB = 1;

如果你需要使用它,那么只需

tokens[instanceVariableA];

因此不再有循环,不再有VARIABLE_A_INDEX ...

也许 JSON 可能有帮助?