【问题标题】:Make a Tree from List of Array (ResultSet for example)从数组列表中创建一棵树(例如 ResultSet)
【发布时间】:2011-05-25 15:12:51
【问题描述】:

我有一个数组列表,就像这个:

List<String[]> myList = new ArrayList<String[]>();
myList.add( new String[]{"A1","B1","C1","D1","values"} );
myList.add( new String[]{"A1","B1","C2","D1","values"} );
myList.add( new String[]{"A1","B1","C2","D2","values"} );
myList.add( new String[]{"A2","B1","C1","D1","values"} );
myList.add( new String[]{"A2","B1","C1","D2","values"} );

我需要填写一个与父亲有依赖关系的对象,所以:

  • A1 只有一个孩子 B1。
    • B1 有 2 个孩子,C1 和 C2。
      • C1 有 1 个孩子 D1,它们的值...
      • C2 有 2 个孩子,D1 和 D2,它们的值...
  • A2 只有一个孩子,B1(与另一个不同)
    • B1 只有一个孩子,C1……等等。

您认为哪种结构更好?我需要名称 A1、B1 等。

我对地图、数组、列表进行了探索...我认为该算法是不可能的... :( :(

请帮忙!

编辑说明:

我有一个来自数据库的 ResultSet,它有 5 或 6 个 GROUP BY 子句。我有所有的普通数据和

我需要用文本对象做一个结构,例如:

Person A - Building 1 - Tower 1 - Some Text A

Person A - Building 1 - Tower 2 - Another Text

Person A - Building 2 - Tower 1 - Another one Text

Person A - Building 2 - Tower 3 - My Text

Person B - Building 1 - Tower 2 - Any Text

Person B - Building 3 - Tower 1 - A Text...

我需要一个对象结构来存储这些数据...可以吗?

【问题讨论】:

  • 看起来你需要一个trie 数据结构。必须有一个标准的 Java 实现。

标签: java algorithm collections tree


【解决方案1】:

我做到了!我的天啊! :D :D :D :D :D :D :D...

private static void finalFillerTotalSuperSpecial(List<String[]> initialList, HashMap<String,Object> mapa){

     String[] currentElement = null;
     String currentKey = null;

     String[] nextElement = null;
     String nextKey = null;
     int i=0,start,end;

     while (i < initialList.size()) {
     start = i;

     currentElement = initialList.get( i++ );
     currentKey = currentElement[0];

     if (i<initialList.size()){
         nextElement = initialList.get( i );
         nextKey = nextElement[0];
     }

     HashMap<String,Object> insideMap = new HashMap<String,Object>(); 
     mapa.put(currentKey, insideMap);

     while (currentKey.equals(nextKey) && i < initialList.size()) {
         currentElement = initialList.get( i++ );
         currentKey = currentElement[0];

         if (i<initialList.size()){
         nextElement = initialList.get( i );
         nextKey = nextElement[0];
         }

     }
     end = i;

     List<String[]> listOfCurrentElements = new ArrayList<String[]>();
     for (int j=start;j<end;j++)
         listOfCurrentElements.add( getNextArray(initialList.get(j)) );

     if ( listOfCurrentElements.get(0).length>1 )
         finalFillerTotalSuperSpecial(listOfCurrentElements,insideMap);
     else
         insideMap.put(listOfCurrentElements.get(0)[0], null);
     }



 }

【讨论】:

    【解决方案2】:

    当然可以。 :)

    我认为您所描述的可以通过通用或 n-ary 树来解决。那是一棵树,其中每个节点都可以有任意数量的子节点。我 wrote 在 Java 中执行此操作。

    如果您不想构建树,可以使用Map&lt;String, Set&lt;String&gt;&gt; 构建。这并不能真正让您轻松访问树操作,但它应该保持关系:

    Map<String, Set<String>> myNodes = new LinkedHashMap<String, Set<String>>();
    for(String[] myArray : myList) {
       String previousNode = null;
       for(String node : myArray) {
          if(myNodes.get(node) == null) {
             myNodes.put(node, new HashSet<String>());
          }
    
          if(previousNode != null) {
             myNodes.get(previousNode).add(node);
          }
    
          previousNode = node;
       }
    }
    

    所以你基本上得到了(我使用 JSON 来演示):

    {
       A1: ["B1"],
       A2: ["B1"],
       B1: ["C1", "C2"],
       C1: ["D1"],
       C2: ["D1", "D2"],
       D1: ["values"],
       D2: ["values"]
    }
    

    然而,这比一棵树更难遍历。

    【讨论】:

    • @Vivin Paliath 我已经阅读了你的实现,它可能很有用...... GenericTreeNode 用于存储元素......现在我将使用算法阅读@PéterTörök......
    • 哇,看起来不错,但是……函数不能是递归的?
    • @ganzux 您可以迭代或递归地遍历树。递归对我来说似乎更容易。迭代遍历需要二级数据结构(节点栈)。
    • 好的,你的代码可以工作,但是孩子们是一样的......例如,对于 A1,我有 B1,我有与 A2 相同的 B1,虽然名称相同,但对象不同...例如,如果我调用“D1”,我会得到“值”,但我不知道值是什么...来自 A1-B1-C1...
    • @ganzux,我想问题是不清楚您的数据要代表什么。我试图从您在问题中发布的内容中推断出树结构。 “价值观”应该是什么意思?还有,孩子都一样是什么意思?
    【解决方案3】:

    所以你想从这个树的列表特定表示中构建一个树结构。

    对于任何树结构,它的节点可以有 0 到 n 个子节点,因此这些子节点可以简单地存储在 List 中(或者,如果您想要快速的话,也可以选择 Map名称查找)。对于此任务,似乎不需要存储父引用。

    然后你只需要遍历myList。对于每个数组元素,

    1. 找到现有树的根。
    2. 遍历数组。
    3. 对于数组中的每个字符串,检查当前树节点是否有同名的子节点。
    4. 如果没有,请创建它并将其添加到树中。
    5. 移动到子节点(使其成为当前节点)。
    6. 从数组中取出下一个字符串并从第 3 步开始重复。
    7. 从列表中取出下一个数组并从步骤 1 开始重复。

    【讨论】:

    • 算法我很喜欢,但它很复杂......一旦我做了什么,我会建议
    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 2021-05-23
    • 2014-07-24
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    相关资源
    最近更新 更多