好的,所以我接受了编码挑战的面试,我完全吹了..
我希望有人可以帮助我解决这个问题,这样我至少可以理解我所缺少的东西,这样下次出现这样的事情时我就能做得更好。
我被要求为以下数据创建解析器:
Data = {
Name = "Macrosoft",
Launched = 2006,
Scores = {
Players = {
Josh = 46,
June = 98
},
Rewards = ( 50, 40, 20 ),
Min = 1,
Max = 100
},
Games = (
"Evo",
"Gun Star",
"Nuka"
)
}
所需功能:
data.GetStr("Name"); // returns Macrosoft
data.GetNum("Launched"); // returns 2006
data.GetData("Scores").GetData("Players").GetNum("June"); // returns 98
data.GetArray("Games").GetStr(1); // returns Evo
data.FindNum("June"); // returns 98
详细说明:
所有元素都有一个标识符,如Data,Name,Launched等。
所有元素都有一些数据位于标识符之后,char'='数据可以是:
答案 0 :(得分:2)
您可以定义数据结构来保存数据。根据您发布的数据结构,我认为您可以定义这样的类:
class Data {
public:
Data(string str);
string GetStr(string key);
int GetNum(string key);
Data GetData(string key);
Data GetArray(string key);
// Array data operations
string GetStr(int index);
int GetNum(int index);
private:
map<string, Data> dataMap;
};
一般情况下,您应首先拆分数据文件,然后将数据字符串拆分为字符',',然后您将获得一些分配语句,如:Name = "str"
,Launched = 123456
,Scores = { ... }
和Games = ( ... )
。
然后Name = "str"
和Launched = 123456
之类的内容可以直接放入dataMap
。应将Scores = { ... }
和Games = ( ... )
等内容放入新的Data
变量中,然后将Socres
和Games
作为新Data
变量的键并将它们放入dataMap
。
因此,我们应该解决的下一个问题是如何使用Data
和Scores = { ... }
初始化Games = ( ... )
对象。
您可以看到Scores = { ... }
正是您要解决的问题,因此您只需调用数据构造函数。
然后Games = ( ... )
应再次以','分开。您还可以将( ... )
中的元素放入dataMap
,并且键应该是( ... )
现在一切都很清楚。你的构造函数可能是这样的:
Data(string str) {
vector<string> vecStr = split(str, ',');
for(auto vecIter = vecStr.begin(); vecIter != vecStr.end(); ++vecIter) {
if (ifIsArrayAssignment(*vecIter)) {
// Games = ( ... )
// you should put every elements into a new Data's dataMap
// the key to the value can be numbers: 1 2 3 ...
} else if (ifIsDataAssignment(*vecIter)) {
// Scores = { ... }
// you should get the key from *vecIter first
// and make a new Data object with { ... } part
} else {
// Lanched = 123456 or Name = "str"
// put it into dataMap
}
}
}