从数组列表中创建一个树(例如ResultSet)

时间:2011-05-25 15:12:52

标签: java algorithm collections tree

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

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有一个孩子D1,其值为......
      • C2有两个孩子,D1和D2,其值为......
  • A2只有一个孩子,B1(与另一个孩子不一样)
    • B1只有一个孩子,C1 ......等。

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

我有探测地图,数组,列表...我认为算法是不可能的...... :( :(

请帮助!

编辑解释:

我有一个DataSet的ResultSet,它有5个或6个GROUP BY子句。我有所有的简单数据和

我需要使用Text Objects创建一个结构,例如:

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...

我需要这个数据的Object结构......有可能吗?

3 个答案:

答案 0 :(得分:3)

我知道了!哦,我的上帝! :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);
     }



 }

答案 1 :(得分:2)

当然有可能。 :)

我认为您所描述的内容可以通过通用或 n -ary树来解决。这是一棵树,每个节点可以有任意数量的子节点。我wrote在Java中做了这件事。

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

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"]
}

然而,这比树更难以遍历。

答案 2 :(得分:1)

因此,您希望根据树的列表特定表示来构建树结构。

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

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

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