Разобрать такую ​​строку в структуру объекта с помощью Java (GWT) - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь разобрать строку в GWT в структуре объекта. К сожалению, я не могу это сделать.

Пример строки:

"(node1(node2(node3) (node4)) (node5))"
  • "node1" имеет 2 детей: "node2" и "node5"
  • "node2" имеет 2 детей: "node3" и "node4"

Объект может быть «узлом», с дочерними элементами. Любая помощь по этому вопросу будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Я могу предоставить вам псевдокод. Я считаю, что следующий алгоритм будет работать, но, пожалуйста, дайте мне знать, если вы заметили что-то не так с ним.

Create a root node called nodeRoot.
current_node = nodeRoot
For each char in the string:
    if the char is '('
        add a child node to current_node
        parse the string (after the '(' char) to fetch the name of the node
        current_node = the newly added child node
    else if the char is ')'
        current_node = parent of current_node

Для отслеживания родителей вы можете использовать стек.

0 голосов
/ 01 марта 2012

Мне довольно скучно, поэтому я собрал код.

  private static class ObjectTree {
    private Set<ObjectTree> children = new LinkedHashSet();
    private ObjectTree parent = null;
    private String text = null;
    private int level = 0;

    public ObjectTree() {
      this(null);
    }

    public ObjectTree(ObjectTree parent) {
      this(parent, 0);
    }

    public ObjectTree(ObjectTree parent, int level) {
      this.parent = parent;
      this.level = level;
    }

    public void addChild(ObjectTree child) {
      children.add(child);
    }

    public void parse(String s) {
      int ix = s.indexOf("(");
      if (ix > 0)
        text = s.substring(0, ix);
      else if (ix <= 0)
        text = s;
      int iy = ix + 1;
      int count = 1;
      if (ix == -1)
        return;
      while (iy < s.length()) {
        if (s.charAt(iy) == ')')
          count--;
        else if (s.charAt(iy) == '(')
          count++;
        if (count == 0) {
          String newString = s.substring(ix + 1, iy);
          ObjectTree newChild = new ObjectTree(this, level + 1);
          addChild(newChild);
          newChild.parse(newString);
          ix = s.indexOf('(', iy);
          count++;
          iy = ix;
        }
        iy++;
      }

    }

    public String toString() {
      StringBuilder sb = new StringBuilder();
      sb.append(StringUtils.repeat("\t.", level)).append(text).append(" :\n");
      for (ObjectTree child : children) {
        sb.append(StringUtils.repeat("\t", level)).append("\t").append(child.toString()).append("\n");
      }
      if (!children.isEmpty())
        sb.append("\n");
      return sb.toString();
    }

  }

Вы называете это так:

ObjectTree root = new ObjectTree();
root.parse("(node1(node2(node3) (node4)) (node5))");
System.out.println(root.toString());

И получите:

(node1(node2(node3) (node4)) (node5)) :
    .node1 :
        .   .node2 :
            .   .   .node3 :
            .   .   .node4 :
        .   .node5 :
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...