【问题标题】:How to parse a certain type of configuration file如何解析某种类型的配置文件
【发布时间】:2014-01-16 21:07:16
【问题描述】:

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

   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表示Map A中的元素B,A.B的值为BDE;同样,A.D.C.A 的价值是 redhat。表示字符串称为“路径表达式”。

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

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

规则

1) 键名和他的值只包含字母(A-Z,a-z)和数字(0-9),没有其他字符;

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

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

输入和输出

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

M

输入:

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 树可以表示为二叉树。因此,所有追加或搜索操作将是二叉树的插入或搜索操作。似乎这种方法有效。但我想知道是否有更好的方法来解决这个问题?

【问题讨论】:

    标签: algorithm data-structures tree


    【解决方案1】:

    我正在考虑将所有孩子放在哈希图中(因为面试官喜欢这样)

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

    【讨论】:

    • 感谢您的评论。我认为这种方法行不通,因为即使您将所有子项放在哈希映射中,您仍然很难找到键的对应值。例如 A={A={A=B};};在这种情况下,如果我们想找到 A[A][A] 的值怎么办?
    • 假设第一个节点被声明为节点,你会做 node.children.get('A').children.get('A').val
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2011-12-10
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多