如何解析某种类型的配置文件

时间:2014-01-16 21:07:17

标签: algorithm data-structures tree

最近我遇到了一个面试问题。我被要求编写用于表达式评估的代码。表达式格式如下所示:

   B=10;
   A={
      A=100;
      B=BDE;
      C=C;
      D={
         A=windows;
         B=mac;
      C={
         A=redhat;
         B=ubuntu;
        };
   };
   A+={
       A=200;
       E=1000;
      };

为了表示表达式的键,使用了句点分隔方法。例如,A.B表示映射A中的元素B,而A.B的值表示BDE;类似地,A.D.C.A的值是redhat。表示字符串称为“路径表达式”。

配置还支持append和override操作。对于上面的例子,我们使用+ =操作来追加或覆盖Map A中的值。现在A.A的值是200,而A.E的值是1000;

现在,给定配置字符串和配置的关键路径,我需要根据配置字符串返回配置值。

规则

1)密钥名称及其值仅包含字母(A-Z,a-z)和数字(0-9),不包含其他字符;

2)如果找不到值或表达式指向地图,请输出“N / A”

3)如果找到该值,请输出该值。输出值时没有空格。

输入和输出

输入有三个部分。第一行包含两个整数,表示连续行数(M)和表达式数(N)。

M <= 100,N <= 100。以下M行是混淆,后N行是表达式。每个配置行包含一个或多个配置。每行长度小于1000.

输入:

2 2

A = {A = 1; B = 2; C = 3; E = {A = 100;};};

A + = {d = 4; E = {B = 10; C = d;};};

A.E.B

B.D.E

输出

A.E.B = 10

B.D.E = N / A

我的想法

我在考虑使用N-nary树来表示表达式。例如,表达式:A = {A = 1; D = 1; B = {C = 1,D = {D = 1,F = 2};};};可以表示为:

                            (A,-)
                         /    |    \
                      (A,1) (D,1)  (B,-)
                                  /    \
                                (C,1)   (D,-)
                                       /    \
                                     (D,1)  (F,2)

由于N-nary树可以表示为二叉树。因此,所有追加或搜索操作都可以是二叉树的插入或搜索操作。看来这种方法有效。但我想知道是否有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

我正在考虑将所有孩子都放在哈希地图中(因为那是采访者喜欢的)

Node{
    String val;
    HashMap<String, Node> children;
    Node(int val){
        this.val = val;
        children = new HashMap<String, Node>();
    }
}