`
eyes1842
  • 浏览: 18254 次
  • 性别: Icon_minigender_1
  • 来自: 默认
最近访客 更多访客>>
社区版块
存档分类
最新评论

树状数据结构的后台缓存方式

阅读更多

我们经常用到一些树状的数据结构,在数据库中通常是用一个字段来记录其父节点的ID。在生成树状结构时,通常使用递归遍历的方法。在某些场合下,如果数据量不大,且更新不是很频繁时,可以将数据库的数据缓存到内存中。下面用一个自定义的特定的Map来保存这些数据:

MultiKeyMap.java

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 
 * @author eyes1842
 *
 * @param <K> Key type
 * @param <V> Value type
 */
public class MultiKeyMap<K,V>{
	
	private Map<K,MultiKeyMap.Entry<K, V>> map = new HashMap<K,MultiKeyMap.Entry<K, V>>();
	
	public V put(K pkey, K fkey, V value) {
		MultiKeyMap.Entry<K,V> entry = new MultiKeyMap.Entry<K,V>(fkey, value);
		map.put(pkey, entry);
		return value;
	}
	
	public V get(K pkey) {
		MultiKeyMap.Entry<K,V> entry = map.get(pkey);
		if(entry!=null&&!entry.isEmpty())
			return entry.getValue();
		else
			return null;
	}
	
	public V remove(K pkey){
		Entry<K,V> e = map.remove(pkey);
        return (e == null ? null : e.value);
	}
	
	public void clear(){
		map.clear();
	}
	
	public Collection<V> values(){
		Collection<V> result = null;
		if(!map.isEmpty()){
			result = new ArrayList<V>(map.size());
			for(MultiKeyMap.Entry<K,V> entry : map.values()){
				result.add(entry.getValue());
			}
		}
		return result;
	}
	
	public Collection<V> getByFKey(K fkey) {
		Collection<MultiKeyMap.Entry<K,V>> entrys = map.values();
		Collection<V> result = null;
		if(!entrys.isEmpty()){
			result = new ArrayList<V>();
			if(fkey==null)
				return result;
			for(MultiKeyMap.Entry<K,V> entry : entrys){
				if(entry.getKey().equals(fkey))
					result.add(entry.getValue());
			}
		}
		return result;
	}
	
	static class Entry<K,V> {
        final K key;
        V value;
        
        Entry(K k, V v) {
            value = v;
            key = k;
        }

        public final K getKey() {
            return key;
        }

        public final V getValue() {
            return value;
        }

        public final V setValue(V newValue) {
	    V oldValue = value;
            value = newValue;
            return oldValue;
        }

        public boolean isEmpty(){
        	return (this==null||getKey()==null);
        }
        
        public final boolean equals(MultiKeyMap.Entry<K,V> o) {
            if (!(o instanceof MultiKeyMap.Entry))
                return false;
            Object k1 = getKey();
            Object k2 = o.getKey();
            if (k1 == k2 || (k1 != null && k1.equals(k2))) {
                Object v1 = getValue();
                Object v2 = o.getValue();
                if (v1 == v2 || (v1 != null && v1.equals(v2)))
                    return true;
            }
            return false;
        }

        public final int hashCode() {
            return (key==null   ? 0 : key.hashCode()) ^
                   (value==null ? 0 : value.hashCode());
        }

        public final String toString() {
            return getKey() + "=" + getValue();
        }
    }
	
	
	/**
	 * Test
	 * @param args
	 */
	public static void main(String[] args) {
		MultiKeyMap<Integer,String> map = new MultiKeyMap<Integer,String>();
		
		map.put(0, 0, "hello_0");
		map.put(1, 0, "hello_1");
		map.put(2, 0, "hello_2");
		map.put(3, 2, "hello_3");
		map.put(4, 3, "hello_4");
		
		List<String> ss = (List<String>) map.getByFKey(0);
		for(String s : ss)
		System.out.println(s);

	}
}

 

这是一个多键值的Map,使用起来很方便,可以具有一般的Map的特点,又支持类似数据库中的主外健的特点。可以根据父节点获取其子节点列表。

 

分享到:
评论

相关推荐

    数据结构精品课程网站

    2. 树结构:课程目录通常采用树形结构表示,层次清晰,便于用户理解和查找相关内容。 3. 数组和集合:网站后台数据库可能使用数组或集合来存储课程数据,如学生报名信息、课程评价等,方便查询和更新。 4. 哈希表:...

    动态数据库加载省市区形成树形结构

    这可能涉及到递归查询或层次查询,例如使用`CROSS APPLY`或`WITH`子句(自连接)来生成树形数据。 3. **后台处理**:在VS2008中,可能使用C#或VB.NET编写后台代码,通过ADO.NET连接数据库,执行上述查询,然后将...

    ajax 方式实现的动态树形结构,从库中取数据

    这个函数使用`$.ajax()`(在jQuery中)或其他类似的方法,向服务器发送GET或POST请求,URL指向处理树形数据的服务器端接口。 3. **服务器端处理**:在服务器端,我们需要一个后端脚本来接收并处理这个请求。它可以...

    Layui的树形表格treeTable

    Layui是一个基于前端MVC模式的轻...总结来说,Layui的treeTable是前端开发中处理层级数据的强大工具,通过合理的配置和API调用,可以构建出灵活、高效、交互性强的树形表格,尤其适合展示具有无限层级的复杂数据结构。

    网页树型结构快速加载大数据量数据的实现.

    树型结构是一种非线性的数据结构,它模仿了自然界中的树形结构,由根节点、分支节点和叶节点组成。在Web应用中,树型结构常用于表示多层次的数据关系,如文件系统、组织架构图、产品分类等。当数据量庞大时,如何...

    安卓动态生成树形结构

    优化点包括使用高效的数据结构(如平衡二叉搜索树)存储数据,以及利用缓存机制减少不必要的数据请求。 7. **UI定制**:为了满足不同设计需求,`TreeView`通常允许自定义节点的样式,包括文字颜色、背景色、图标等...

    element-ui树形控件后台返回的数据+生成组织树的工具类

    【Element UI 树形控件】是前端框架Element UI中的一种组件,用于展示层次结构的数据,常用于构建如文件系统、组织结构等场景。...总之,正确处理和构建树形数据结构对于高效使用Element UI的树形控件至关重要。

    社区网部分数据结构

    社区网部分数据结构可能指的是社区网络平台(如社交网站、论坛等)在后台使用的数据结构设计。这些数据结构对于优化社区网络的功能至关重要,包括用户交互、信息检索、关系网络构建等多个方面。 首先,我们来了解...

    PHP ajax Tree树形菜单 v1.0

    1. **数据结构**:首先,后台PHP脚本需要将数据结构化为树形,通常以数组或JSON格式存储。每个节点包含ID、文本、子节点等属性。 2. **前端渲染**:JavaScript利用这些数据生成HTML结构,构建出可视化的树形菜单。...

    各个组织结构树形节点文件夹创建、文件上传、下载预览

    1. **组织结构树形节点**:在许多企业系统中,数据和资源的组织方式通常是通过树形结构来实现的,模拟了现实世界中的层级关系。例如,公司内部的部门、团队等可以被视为树形结构的节点。用户可以根据这些节点来访问...

    Ajax+jsp+oracle实现动态树形菜单

    在IT行业中,动态树形菜单是一种常见的用户界面元素,它能以树状结构展示数据,使得用户能够方便地浏览和操作层次化的信息。本项目利用Ajax、JSP和Oracle数据库技术,实现了这样一个功能,让我们来深入探讨一下这些...

    JSTree(js写的树形菜单,支持加载10000节点以上)

    在Web开发中,树形菜单是一种常见的数据展示形式,用于组织和展示层次结构的数据。JSTree是一款基于JavaScript的开源库,专为构建功能丰富的交互式树形菜单而设计。它支持动态加载大量节点,即使面对超过10000个节点...

    全静态树形论坛ASP

    全静态树形论坛ASP是一种基于ASP(Active Server Pages)技术构建的在线讨论平台,它具有独特的树状结构,便于用户浏览和参与讨论。这个论坛设计的主要特点是其静态化处理,这意味着论坛页面在用户访问时无需服务器...

    Extjs 无限树菜单 后台拼接json

    树形菜单是一种以节点和层级关系展示数据的控件,每个节点可以有子节点,形成一棵倒置的树状结构。在Web应用中,这种菜单常用于组织大量有层次的数据,如文件系统、组织架构或导航菜单。 在ExtJS中,实现无限树菜单...

    树形框操作类提高性能树形框操作类提高性能

    堆是一种特殊的树形数据结构,通常用于优先队列或实现高效排序算法。在树形框中,堆可以帮助我们快速找到最大或最小的节点,优化搜索性能。 在提供的文件"源码使用说明.txt"中,可能会详细解释如何实现上述优化策略...

    c#无限加载的树形DEMO

    2. **代码逻辑**:`DefaultTree.aspx.cs`是后台处理代码,其中包含了加载树形结构的逻辑。这部分代码可能包括获取数据源(如数据库查询)、构造TreeNode对象并添加到TreeView控件中,以及处理节点展开和折叠的事件。...

    SSH框架下的用户权限管理(树形结构)

    4. **前端展示**:利用MzTreeView或其他类似的JavaScript库,将后端返回的权限数据渲染成树形结构。用户可以通过点击、拖拽等方式对树节点进行操作,这些操作会触发Ajax请求更新后端数据。 5. **权限控制**:在业务...

    无限级树形菜单(Sql数据库)

    在IT领域,尤其是在Web开发中,无限级树形菜单是一种常见的数据结构,它用于构建具有层级关系的导航系统。在本场景中,我们关注的是如何在Sql数据库中存储和操作这种无限级树形结构,以及如何在前端展示。以下是相关...

    树形菜单Ajax实现

    在网页开发中,树形菜单是一种常见的数据展示方式,它以层级结构呈现,常用于网站导航、文件系统浏览等场景。Ajax(Asynchronous JavaScript and XML)技术则为动态更新页面内容提供了可能,无需刷新整个页面即可与...

    ajax动态树形列表

    而“动态树形列表”是一种数据展示方式,它使用了树状结构来组织和展示信息,用户可以通过展开和折叠节点来探索层级关系。这种列表通常用于文件系统、菜单导航、组织结构等场景,能够清晰地呈现复杂的层次结构。 ...

Global site tag (gtag.js) - Google Analytics