最近用ext开发一个类似列表性的东西,为了直观一些我截屏了幅图.

数据的组装结构是LinkedHashMap<String, LinkedHashMap<String, LinkedList<TargetObject>>>最里面的TargetObject是真正里面显示的页面所需要的数据.
由于当时的难点是前台的显示,所以在开发后台程序的时候,也是前台程序显示的思路编写:先组转最外层的LinkedHashMap,然后组装里面的LinkedHashMap和LinkedList.
程序如下:
LinkedHashMap<String,LinkedHashMap> nodeHashMap = new LinkedHashMap<String,LinkedHashMap>();
LinkedHashMap<String,LinkedList<TargetObject>> companyHashMap = null;
TargetObject taskObject = new TargetObject();
taskObject.setFlowId(flowId);
List<TargetObject> tempTaskList = netdTaskService.searchTargetObjectList(taskObject);
//set detailObject to null as judgement afterward
detailObject = null;
LinkedHashMap<String,LinkedList<TargetObject>> nodeStoredList = new LinkedHashMap<String,LinkedList<TargetObject>>();
String[] flowArray = new String[]{"zdwlsjzzfa","shwlsjzzfa","spwlsjzzyj","zdjhhjtap","zzrzzwlsj","shwlsjzzjg","zxwlsjzzbcs","fxzxqkbtxssjg","gd"};
for(String htName : flowArray){
nodeStoredList.put(htName, new LinkedList<TargetObject>());
}
if(tempTaskList.size()>0){
LinkedList<TargetObject> nodeList;
for(String htName : flowArray){
for(TargetObject temp : tempTaskList){
if(htName.equals(temp.getHtName())){
//seperate history task to different node
nodeList = nodeStoredList.get(htName);
nodeList.add(temp);
//for echoing detail info if exist
if(detailObject==null&&htName.equals(object.getHtName())&& userId.equals(temp.getOwnerId())){
detailObject = temp;
}
}
}
}
for(Map.Entry<String,LinkedList<TargetObject>> nodeEntry : nodeStoredList.entrySet()){
//get the history task list related to node
nodeList = nodeEntry.getValue();
if(nodeList.size()>0){
companyHashMap = new LinkedHashMap<String,LinkedList<TargetObject>>();
String nodeChineseName = ((TargetObject)nodeList.get(0)).getHtDescription();
while(nodeList.size()>0){
Iterator<TargetObject> it = nodeList.iterator();
LinkedList<TargetObject> companyLinkedList = new LinkedList<TargetObject>();
//there must be some task record if coming here
String companyName = (nodeList.get(0)).getCompanyName();
while(it.hasNext()){
TargetObject tempTask = it.next();
if(companyName.equals(tempTask.getCompanyName())){
companyLinkedList.add(tempTask);
//remove the task record when be gathered
it.remove();
}
}
//put history task list into company HashMap
companyHashMap.put(companyName, companyLinkedList);
}
//put HashMap of comany into node map
nodeHashMap.put(nodeChineseName,companyHashMap);
}
else {
//break when there's no task record from this node
break;
}
}
}
后来发现可以从数据的角度考虑组装,而且实现起来比较简洁.
LinkedHashMap<String,LinkedHashMap> nodeHashMap = new LinkedHashMap<String,LinkedHashMap>();
TargetObject taskObject = new TargetObject();
taskObject.setFlowId(flowId);
List<TargetObject> tempTaskList = netdTaskService
.searchTargetObjectList(flowId);
LinkedHashMap<String, LinkedList<TargetObject>> nodeHistoryMap = new LinkedHashMap<String, LinkedList<TargetObject>>();
LinkedList<TargetObject> companyList = new LinkedList<TargetObject>();
TargetObject tempObject;
if (TextUtil.isNull(tempTaskList))
return;
for (int i = 0; i < tempTaskList.size(); i++) {
tempObject = tempTaskList.get(i);
nodeHistoryMap = nodeHashMap.get(tempObject.getHtDescription());
//如果不存在创建一个新的节点列表
if (nodeHistoryMap != null) {
companyList = nodeHistoryMap.get(tempObject.getCompanyName());
//如果不存在创建一个新的公司列表
if (companyList != null) {
companyList.add(tempObject);
} else {
companyList = new LinkedList<TargetObject>();
companyList.add(tempObject);
//组装公司列表
nodeHistoryMap.put(tempObject.getCompanyName(),
companyList);
}
} else {
companyList = new LinkedList<TargetObject>();
companyList.add(tempObject);
nodeHistoryMap = new LinkedHashMap<String, LinkedList<TargetObject>>();
//组装公司列表
nodeHistoryMap.put(tempObject.getCompanyName(), companyList);
//组装节点列表
nodeHashMap.put(tempObject.getHtDescription(), nodeHistoryMap);
}
}
现在想想,其实还是思路的凝滞,在开发的时候容易形成思维定势.记录一下,以后常记.