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