如何把查询的数据转化为树,求解
如下,是数据库查询的数据:
43, 科技, 53, 计算机, 35, 数据库,233, oracle 43, 科技, 53, 计算机, 35, 数据库,234, mysql 43, 科技, 53, 计算机, 35, 数据库,47, mssql 43, 科技, 53, 计算机, 35, 数据库,48, access 43, 科技, 53, 计算机, 35, 数据库,238, mongodb 43, 科技, 53, 计算机, 35, 数据库,278, Cassandra 43, 科技, 76, 工程, 182, 电力工程,276, 电力系统 43, 科技, 76, 工程, 183, 软件工程,277,软件产品线工程 43, 科技, 76, 工程, 247, 土木工程,340,土木工程测量 42, 教育, 42, 语言文字, 73, 语言学,103, 粤语新手快速上口 42, 教育, 42, 语言文字, 73, 语言学,205, 文字侦探 42, 教育, 42, 语言文字, 74, 汉语,104, 说文解字
如何把上面的数据转换为以下的树结构:
书 --科技 --计算机 --数据库 --oracle --mysql --mssql --access --mongodb --Cassandra --工程 --电力工程 --电力系统 --软件工程 --软件产品线工程 --土木工程 --土木工程测量 --教育 --语言文字 --语言学 --粤语新手快速上口 --文字侦探 --汉语 --说文解字
问题补充
4层for循环,性能其实是O(n)的。n是原始数据的总行数。因为最里层的println执行的次数刚好是总的行数,另外三个println各自总的执行次数都小于这个数。
你这数据有问题吧,不完整
id:001
id:001-001 parentid:001
id:001-001-001 parentid:001-001
以此类推,就形成了层级关系(不就是树嘛)
你这些数据多存在一个表里?
你的这些数据之间并没有联系,你需要为每一个节点加一个父结点属性,这样你就可以利用父结点的属性来递归树结构了。
建议改表结构,改成这样:
id name parent_id
1 书 1
43 科技 1
53 计算机 43
35 数据库 53
.
.
.
然后这样查询:
[code="xml"]
select * from t
start with id = 1
CONNECT BY PRIOR t.id = t.parent_id
[/code]
使用父亲节点关联可行的。
用hashmap,比如
43, 科技, 53, 计算机, 35, 数据库,233, oracle
43, 科技, 53, 计算机, 35, 数据库,234, mysql
遇到第一行
key value
43 53
53 35
35 233
233 null
第二行 用一个临时变量tempKey记住 key
43,看看在key中存在不?存在就pass tempKey=43
53,在key中存在pass tempKey=53
35,在key中存在 tempKey=35
234,在可以中不存在 则 在key=tempKey插入234,并新增key为234的值
key value
43 53
53 35
35 233,234
233 null
234 null
其他类似,
如:43, 科技, 76, 工程, 182, 电力工程,276, 电力系统
43 存在 tempKey=43
76 不存在 后面你就可以不用判断 全部 插入
76 182
182 276
最后展示的时候,找到key,然后遍历里面的value,value所对应的key直到value 为null就返回。
一种办法,空间耗费较大。。如果大数据量要另寻方法。
这个问题在数据结构看,应该是把数据库信息导出到xml文件中,
方案: a 见一个根节点 root (书)
假设root深度是0
第一列深度是1,第二列深度是2,依次类推
b 查询出每一条数据,对每一条数据进行解析:
1、取出第一列的值,查看root中是否有该节点,没有就加上,有就跳过
2、取第二列的值,查看第一列对应的节点中是否含有本节点,有就跳过,没有就加上
3、如上查看第三列
4、查看第四列,如果如果第三列对应的节点中有第四列的值,就跳过,没有就加上
5、下一条数据库记录
用一个Map>>>怎么样?
下面是可以工作的代码:
[code="java"]
package hierlist;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.LinkedHashMap;
public class hierlist {
public static void main(String[] args) throws Exception {
List<String> lines = org.apache.commons.io.IOUtils.readLines(System.in);
Map<String, Map<String, Map<String, List<String>>>> a = new LinkedHashMap<String, Map<String, Map<String, List<String>>>>();
for (String line : lines) {
String[] fields = line.split(", ?");
// 下面是保证每层都有对象,而不是空指针。这些可能有些难看。
if (!a.containsKey(fields[1])) {
a.put(fields[1], new LinkedHashMap<String, Map<String, List<String>>>());
}
if (!a.get(fields[1]).containsKey(fields[3])) {
a.get(fields[1]).put(fields[3], new LinkedHashMap<String, List<String>>());
}
if (!a.get(fields[1]).get(fields[3]).containsKey(fields[5])) {
a.get(fields[1]).get(fields[3]).put(fields[5], new ArrayList<String>());
}
// 放入最右边的值。
a.get(fields[1]).get(fields[3]).get(fields[5]).add(fields[7]);
}
// 显示输出
for (String k1 : a.keySet()) {
System.out.println(k1);
for (String k2 : a.get(k1).keySet()) {
System.out.println(" " + k2);
for (String k3 : a.get(k1).get(k2).keySet()) {
System.out.println(" " + k3);
for (String v : a.get(k1).get(k2).get(k3)) {
System.out.println(" " + v);
}
}
}
}
}
}
[/code]
输入楼主的那些数据,记得按ctrl+z(windows)或者ctrl+d(linux)结束输入。
输出结果:
[quote]
科技
计算机
数据库
oracle
mysql
mssql
access
mongodb
Cassandra
工程
电力工程
电力系统
软件工程
软件产品线工程
土木工程
土木工程测量
教育
语言文字
语言学
粤语新手快速上口
文字侦探
汉语
说文解字
[/quote]
稍微调整一下格式就和期望的一样了。