package Test;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
public class DataTree {
protected String idField = "id";
protected String pidField = "pid";
protected String nodesField = "children";
protected String rootId = "-1";
protected String leafField = "isLeaf";
protected String levelField = "_level";
protected String expandedField = "expanded";
protected ArrayList tree = new ArrayList(); //树形数据
protected ArrayList list = new ArrayList(); //列表数据
protected ArrayList dataview = null; //数据视图:折叠
protected HashMap idMaps = new HashMap();
public DataTree(String idField, String pidField, String nodesField)
{
this.idField = idField;
this.pidField = pidField;
this.nodesField = nodesField;
}
/// <summary>
/// 加载列表数据
/// </summary>
/// <param name="list"></param>
public void LoadList(ArrayList list)
{
if (list == null) list = new ArrayList();
ArrayList tree = TreeUtil.ToTree(list, nodesField, idField, pidField);
Load(tree);
}
/// <summary>
/// 加载树形数据
/// </summary>
/// <param name="tree"></param>
public void Load(ArrayList tree)
{
//节点必须有idField
if (tree == null) tree = new ArrayList();
list = TreeUtil.ToList(tree, "-1", nodesField, idField, pidField);
dataview = null;
//idField存储哈希,便于快速检索
idMaps = new HashMap();
for (int i = list.size() - 1; i >= 0; i--)
{
HashMap node = (HashMap)list.get(i);
idMaps.put(node.get(idField).toString(), node);
}
//遍历列表,生成leafField, levelField
for (int i = list.size() - 1; i >= 0; i--)
{
HashMap node = (HashMap)list.get(i);
String id = node.get(idField).toString();
ArrayList nodes = (ArrayList)node.get(nodesField);
node.put(leafField, (nodes == null || nodes.size() == 0) ? true : false);
node.put(levelField, GetAncestors(id).size());
}
//清除折叠信息
_collapseNodes = new ArrayList();
DoExpandeds();
//清除过滤信息
filtered = null;
}
public int GetTotalCount()
{
return GetDataView().size();
}
public ArrayList GetPagedData(int pageIndex, int pageSize)
{
//1)折叠后的数据视图
ArrayList list = GetDataView();
//2)返回分页数据
int pages = list.size() / pageSize;
if (pages * pageSize < list.size()) pages += 1;
if (pageIndex > pages - 1) pageIndex = pages - 1;
ArrayList nodes = new ArrayList();
int start = pageIndex * pageSize;
int end = (pageIndex + 1) * pageSize;
for (int i = start; i < end; i++)
{
if (i > list.size() - 1 || i < 0) continue;
HashMap node = (HashMap)list.get(i);
if (node == null)
{
continue;
}
nodes.add(node);
}
return CloneNodes(nodes);
}
//////////////////////////////////////////////////////////////////////////////////
protected ArrayList _collapseNodes = new ArrayList();
public void SetRequest(HttpServletRequest request)
{
String s = request.getParameter("__ecconfig");
if (!StringUtil.isNullOrEmpty(s))
{
HashMap config = (HashMap)JSON.Decode(s);
_collapseNodes = (ArrayList)config.get("collapseNodes");
if (_collapseNodes == null) _collapseNodes = new ArrayList();
}
DoExpandeds();
dataview = null;
}
protected void DoExpandeds()
{
//处理expandedField
for (int i = 0, l = list.size(); i < l; i++)
{
HashMap node = (HashMap)list.get(i);
node.remove(expandedField);
}
for (int i = 0, l = _collapseNodes.size(); i < l; i++)
{
String id = _collapseNodes.get(i).toString();
HashMap node = GetNode(id);
node.put(expandedField, false);
}
}
//////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// 获取数据视图:过滤、折叠后
/// </summary>
/// <returns></returns>
public ArrayList GetDataView()
{
if (dataview == null)
{
//expanded
ArrayList data = new ArrayList();
for (int i = 0,l=list.size(); i<l; i++)
{
HashMap node = (HashMap)list.get(i);
if (IsVisibleNode(node))
{
data.add(node);
}
}
//filter
if (filtered != null)
{
//1)缓存过滤节点和父节点
HashMap filterMaps = new HashMap();
for (int i = 0, l = filtered.size(); i < l; i++)
{
HashMap node = (HashMap)filtered.get(i);
String id = node.get(idField).toString();
if (filterMaps.get(id) == null) filterMaps.put(id, node);
ArrayList ans = GetAncestors(id);
for (int j = 0, k = ans.size(); j < k; j++)
{
HashMap pnode = (HashMap)ans.get(j);
String pid = pnode.get(idField).toString();
if (filterMaps.get(pid) == null) filterMaps.put(pid, pnode);
}
}
//2)data删除所有不存在filterMaps中的节点
for (int i = data.size() - 1; i >= 0; i--)
{
HashMap node = (HashMap)data.get(i);
String id = node.get(idField).toString();
if (filterMaps.get(id) == null)
{
data.remove(i);
}
}
}
dataview = data;
}
return dataview;
}
protected ArrayList filtered = null;
/// <summary>
/// 设置过滤后的节点数组
/// </summary>
/// <param name="nodes"></param>
public void SetFiltered(ArrayList nodes)
{
filtered = nodes;
dataview = null;
}
//////////////////////////////////////////////////////////////////////////////////
public ArrayList GetAncestors(String id)
{
ArrayList ans = new ArrayList();
while (true)
{
HashMap parentNode = GetParentNode(id);
if (parentNode == null) break;
ans.add(parentNode);
id = parentNode.get(pidField).toString();
}
reverseArray(ans);
return ans;
}
public HashMap GetParentNode(String pid)
{
return (HashMap)idMaps.get(pid);
}
public ArrayList GetChildNodes(String id)
{
HashMap node = (HashMap)idMaps.get(id);
if (node == null) return null;
return (ArrayList)node.get(nodesField);
}
public HashMap GetNode(String id)
{
return (HashMap)idMaps.get(id);
}
protected Boolean IsVisibleNode(HashMap node)
{
HashMap parent = GetParentNode(node.get(pidField).toString());
if (parent == null) return true;
if (parent.get(expandedField) == null) return IsVisibleNode(parent);
if ((Boolean)parent.get(expandedField) == false) return false;
return true;
}
protected ArrayList CloneNodes(ArrayList nodes)
{
ArrayList clone = (ArrayList)JSON.Decode(JSON.Encode(nodes));
for (int i = 0, l = clone.size(); i < l; i++)
{
HashMap node = (HashMap)clone.get(i);
node.remove(nodesField);
}
return clone;
}
protected static void reverseArray(List b) {
int left = 0; // index of leftmost element
int right = b.size()-1; // index of rightmost element
while (left < right) {
// exchange the left and right elements
Object temp = b.get(left);
b.set(left, b.get(right));
b.set(right, temp);
// move the bounds toward the center
left++;
right--;
}
}
}
最近下载更多
wusiyin LV14
2022年9月15日
askeydingxu2020 LV8
2020年11月28日
skipple3 LV39
2020年11月19日
xcj456 LV8
2020年9月12日
hzhsh0223 LV18
2020年3月7日
yfsh123 LV6
2019年8月9日
y_yuyongyi LV1
2019年8月7日
wanglong_wang LV13
2019年8月1日
zbchen2008 LV6
2019年7月9日
丷夏空丷 LV4
2019年5月19日

最近浏览