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

Java 从数组列表中创建树(例如ResultSet),java,algorithm,collections,tree,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"} )

我有一个数组列表,如下所示:

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"} );

我需要这个数据的对象结构。。。有可能吗?

当然有可能

我认为你所描述的可以通过泛型树或n元树来解决。这是一棵树,每个节点可以有任意数量的子节点。我用Java做了一些事情

如果不想构建树,可以使用
映射构建。这实际上并不能让您轻松访问树操作,但它应该维护以下关系:

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;
   }
}

但是,这比树更难遍历。

因此,您需要根据树的列表特定表示构建树结构

对于任何树结构,其节点可以有0到n个子节点,因此子节点可以简单地存储在
列表
(或者,如果希望快速查找名称,可以选择
映射)。对于此任务,似乎没有必要存储父引用

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

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

  • 我做到了!天哪D: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);
         }
    
    
    
     }
    
    private static void finalfillertotatasuperspecial(List initialList,HashMap mapa){
    字符串[]currentElement=null;
    字符串currentKey=null;
    字符串[]nextElement=null;
    字符串nextKey=null;
    int i=0,开始,结束;
    而(i如果(i@VivinPaliath我已经阅读了你的实现,它可能很有用…元素到存储的GenericTreeNode…现在我将用算法阅读@Péter Török…哇,它看起来很棒,但是…函数musn不是递归的?@ganzux你可以迭代或递归地遍历树。递归对我来说似乎更容易。迭代遍历需要一个二级数据结构(节点堆栈)。好的,您的代码可以工作,但子级是相同的…例如,对于A1,我有B1,对于A2,我有相同的B1,虽然名称相同,但是不同的对象…例如,如果我调用“D1”,我会得到“值”,但我不知道什么是值…来自A1-B1-C1…@ganzux,我想问题是不清楚你的数据代表什么。我试图从你在问题中发布的内容推断出一个树结构。什么是“值”应该是什么意思?还有,你说孩子们是一样的是什么意思?我同意这个算法,但它很复杂…一旦我做了什么,我会建议你看起来需要一个数据结构。必须有一个标准的Java实现。
    
    {
       A1: ["B1"],
       A2: ["B1"],
       B1: ["C1", "C2"],
       C1: ["D1"],
       C2: ["D1", "D2"],
       D1: ["values"],
       D2: ["values"]
    }
    
    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);
         }
    
    
    
     }