`
tear
  • 浏览: 60991 次
  • 性别: Icon_minigender_2
  • 来自: 广西
社区版块
存档分类

递归算法查询无级树形结构下任意分类及其子分类下所有新闻

    博客分类:
  • java
阅读更多
想到用递归算法来实现无级树形分类下任意分类及其子分类下的所有新闻:

java 代码
 
  1. package com.lingirl.test;  
  2.   
  3. import java.util.*;  
  4.   
  5. /** 
  6.  * @author lingirl 
  7.  * 2007-08-19 
  8.  */  
  9. public class Category {  
  10.       
  11.     private Long id;  
  12.     private Category p_category;  
  13.     private String name;  
  14.     private Set children;  
  15.     private Set news;
  16.   
  17. }  

java 代码
 
  1. package com.lingirl.test;  
  2.   
  3. /** 
  4.  * @author lingirl 
  5.  * 2007-08-19 
  6.  */  
  7.   
  8. public class News {  
  9.     private Long id;  
  10.     private String name;  
  11.     private Category category;  
  12.   
  13. }  

java 代码
 
  1. package com.lingirl.test;  
  2.   
  3. import java.util.*;  
  4.   
  5. /** 
  6.  * @author lingirl 
  7.  * 2007-08-19 
  8.  */  
  9.   
  10. public class Treetest {  
  11.     //递归算法求出任意树形分类节点及其所有子类下的所有新闻  
  12.     public Set getAllnews(Category category){  
  13.         if(category.getChildren()!=null)  
  14.         {  
  15.             Iterator chr=category.getChildren().iterator();  
  16.               
  17.             while(chr.hasNext()){  
  18.                  category.getNews().addAll(getAllnews((Category)chr.next()));  
  19.             }  
  20.               
  21.         }  
  22.         return category.getNews();  
  23.     }  
  24.       
  25.   
  26.     /** 
  27.      * @param args 
  28.      */  
  29.     public static void main(String[] args) {  
  30.         // TODO 自动生成方法存根  
  31.         /**假设有一树形分类: 
  32.          * 01 
  33.          *   0101 
  34.          *   0102 
  35.          *       010201 
  36.          * 初始化如下:       
  37.          */  
  38.             Category c01=new Category();  
  39.             c01.setName("01");  
  40.           
  41.             Category c0101=new Category();  
  42.             c0101.setName("0101");  
  43.             //c0101.setP_category(c01);  
  44.             Category c0102=new Category();  
  45.             c0102.setName("0102");  
  46.             //c0102.setP_category(c01);  
  47.               
  48.             Set categories=new HashSet();  
  49.             categories.add(c0101);  
  50.             categories.add(c0102);  
  51.             c01.setChildren(categories);  
  52.               
  53.             Category c010201=new Category();  
  54.             c010201.setName("010201");  
  55.             //c010201.setP_category(c0102);  
  56.             Set categories2=new HashSet();  
  57.               
  58.             categories2.add(c010201);  
  59.             c0102.setChildren(categories2);  
  60.               
  61.             News n1=new News();  
  62.             n1.setName("n1");  
  63.             News n2=new News();  
  64.             n2.setName("n2");  
  65.               
  66.             News n3=new News();  
  67.             n3.setName("n3");  
  68.             News n4=new News();  
  69.             n4.setName("n4");  
  70.             News n5=new News();  
  71.             n5.setName("n5");  
  72.             News n6=new News();  
  73.             n6.setName("n6");  
  74.               
  75.             //c01下有新闻:n1  
  76.             Set news1=new HashSet();  
  77.             news1.add(n1);  
  78.             c01.setNews(news1);  
  79.               
  80.             //c0101下有新闻:n2  
  81.             Set news2=new HashSet();  
  82.             news2.add(n2);  
  83.             c0101.setNews(news2);  
  84.               
  85.             //c0102下有新闻:n3,n4  
  86.             Set news3=new HashSet();  
  87.             news3.add(n3);  
  88.             news3.add(n4);  
  89.             c0102.setNews(news3);  
  90.               
  91.             //c010201下有新闻:n5,n6  
  92.             Set news4=new HashSet();  
  93.             news4.add(n5);  
  94.             news4.add(n6);  
  95.             c010201.setNews(news4);  
  96.               
  97.         Treetest test=new Treetest();  
  98.         Set news=test.getAllnews(c010201);//递归查询出分类c010201及其所有子分类下所有新闻;  
  99.         System.out.println(news.size());  
  100.         Iterator s=news.iterator();  
  101.         while(s.hasNext()){  
  102.             News n=(News)s.next();  
  103.             System.out.println(n.getName());  
  104.             }  
  105.         }  
  106.   
  107. }  

这时查询的是分类c010201,结果打印为:
2
n5
n6

假如查询分类c0102,结果将包含子分类c010201的新闻,结果为:
4
n3
n4
n5
n6

不知道有没有可能通过一句SQL就能实现?先谢谢大家了
分享到:
评论
7 楼 rtdb 2007-08-22  
> 是否位运算与字符串比较,更有效率呢?

TEST it!
6 楼 tear 2007-08-22  
iunknown 写道


如果用这种,不如彻底一点。使用 string 类型,需要用 like 来实现查询。不如直接使用 int 作为 id ,整数中的不同 bit 作为不同级别的 id 。详细的做法可以参考
http://www.web745.com/article/303.html


根据iunknown提供的资料,尝试采取了这样的做法:ID字段保持不变,在分类里增加一个字段code bigint,最大值是2的64次方,分为8个深度级别的话,每一级可以包括256个项目。

把编码转换成2进制,前8位是第一级,与字符串型编码类似,用16进制来显示的话,01 00 00 00 00 00 00 00是第一级别。01 01 00 00 00 00 00 00是上一个分类的下级分类。下级的最高位都是相同的,因此如果我们希望取得某一分类极其所有子类下的所有新闻,可以使用from News where newsCategory.code>=01 00 00 00 00 00 00 00 and newsCategory.code<02 00 00 00 00 00 00 00。(不知道这样做是否跟iunknown所说到的方法一致?)

但现在对位运算编码和字符串编码的选择有很大疑惑,似乎字符串的更简单,而位运算相对就复杂了点。是否位运算与字符串比较,更有效率呢?
5 楼 tear 2007-08-22  
szjiang 写道
看看这样行不行.将分类的数据结构变动一下.
public class Category {   
       
    private String id;   
    private Category p_category;   
    private String name;   
    private Set children;   
    private Set news;

   
} 

id的格式如下:001,001001,001002,002,002001等.
这样的话要查询子孙节点的数据不就可以用
from news where category.id like '001%'


这样编码结构确实清晰,也比较容易实现,而我最担心的是使用字符串做模糊查询,是否会影响效率呢?
4 楼 kaki 2007-08-22  
谢谢,正在看!!
3 楼 xyz20003 2007-08-21  
彻底一点似乎不错,但保存和修改节点的时候,操作都挺复杂的。不知道两者之间的效率相差多少,如果相差不多,是不是可以使用字符串更简单一些呢?
2 楼 iunknown 2007-08-19  
szjiang 写道
看看这样行不行.将分类的数据结构变动一下.
public class Category {   
       
    private String id;   
    private Category p_category;   
    private String name;   
    private Set children;   
    private Set news;

   
} 

id的格式如下:001,001001,001002,002,002001等.
这样的话要查询子孙节点的数据不就可以用
from news where category.id like '001%'


如果用这种,不如彻底一点。使用 string 类型,需要用 like 来实现查询。不如直接使用 int 作为 id ,整数中的不同 bit 作为不同级别的 id 。详细的做法可以参考
http://www.web745.com/article/303.html
1 楼 szjiang 2007-08-19  
看看这样行不行.将分类的数据结构变动一下.
public class Category {   
       
    private String id;   
    private Category p_category;   
    private String name;   
    private Set children;   
    private Set news;

   
} 

id的格式如下:001,001001,001002,002,002001等.
这样的话要查询子孙节点的数据不就可以用
from news where category.id like '001%'

相关推荐

    Java递归算法构造JSON树形结构

    Java 递归算法构造 JSON 树形结构 Java 递归算法构造 JSON 树形结构是指通过 Java 语言使用递归算法将数据库中的菜单表构建成树形的 JSON 格式发送给第三方。这种方法可以将复杂的树形结构数据转换成易于理解和处理...

    用递归实现C#树形结构

    本篇将详细探讨如何使用递归方法来实现C#中的树形结构。 首先,理解树形结构的基本概念至关重要。在计算机科学中,树是由节点(也称为顶点)和边组成的非线性数据结构。每个节点可以有零个或多个子节点,而顶部的...

    Oracle递归树形结构查询功能

    通过递归查询,我们可以轻松地获取任意部门及其所有子部门的信息,无需编写复杂的Java或其他编程语言代码。 在进行递归查询优化时,要注意避免无限循环和性能问题,确保`CONNECT BY`条件正确无误,必要时还可以使用...

    mysql 树形结构查询

    这种查询方式可以高效地查询树形结构的数据,并且可以根据需要设置递归深度。 MySQL 中的树形结构查询可以使用存储过程来实现,存储过程是一种复杂的查询逻辑,可以将复杂的查询逻辑封装在存储过程中,以提高查询...

    jpa单表递归树形结构实现

    在本示例中,我们将探讨如何使用Spring JPA来实现单表递归树形结构。 首先,我们需要理解递归树形结构。在数据库中,树形结构通常通过自关联来表示,即一个表的某个字段引用该表自身,形成一个层级关系。对于单表...

    Ajax无级分类树形结构

    在IT行业中,Ajax无级分类树形结构是一种常见的前端数据展示方式,特别是在文件管理系统、组织架构展示或导航菜单设计中。这种技术利用Ajax(异步JavaScript和XML)技术,实现页面无需刷新即可动态加载和更新树形...

    基于JAVA建立树形结构的算法优化.pdf

    由于树形结构的重要性,关于树形结构及其算法的研究是数据结构和算法分析领域的热点之一。因此,研究如何在Java中实现高效、稳定且易于扩展的树形结构具有重要的实践意义和理论价值。 最后,文章中提到的参考文献...

    Java递归将List转为树形结构Java递归将List转为树形结构

    Java递归将List转为树形结构 博客地址:https://blog.csdn.net/weixin_38500202/article/details/110456363

    无级分类(无递归)+无级JS联动+树状显示+导航输出+批量移动

    3. **树状显示**:数据以树形结构呈现,这是一种直观的组织方式,可以帮助用户快速理解和导航复杂的分类体系。树状显示不仅包括分类名,还可能包含其他相关信息,如分类数量、状态等,方便用户进行决策。 4. **导航...

    C#控制台用递归方法显示树形结构

    在编程领域,尤其是在数据结构和算法的学习中,树形结构是一种非常重要的概念。它用于模拟具有层次关系的数据,比如文件系统、组织结构等。在这个场景中,我们将探讨如何使用C#语言来实现一个控制台应用,它能用递归...

    基于递归算法和树形控件的动态树形图的实现

    递归函数接收节点ID作为参数,查询数据库以获取该节点的子节点信息,并继续递归调用自身以构建完整的树形结构。 ##### 2.1 数据库设计 为了支持动态树形图,数据库表设计需考虑以下几点: - **节点表**:存储所有...

    VC对磁盘文件遍历搜索的递归算法和非递归算法

    非递归算法在处理大量文件和深目录树时,性能通常优于递归算法,因为它减少了函数调用开销,且内存占用更可控。 **VC++实现细节**: 在提供的`查找指定文件.rar`压缩包中,可能包含了一个VC++工程文件,用于演示非...

    5!递归算法和非递归算法

    ### 5!递归算法和非递归算法 在计算机科学与编程领域中,递归算法与非递归算法是两种非常重要的计算方法。本文将详细介绍这两种算法的特点、应用...希望本文能帮助初学者更好地理解递归与非递归算法的概念及其应用。

    .net 递归算法 .net 递归算法.net 递归算法

    - **树形结构遍历**:如二叉树、多叉树的深度优先搜索(DFS)通常采用递归实现,通过访问当前节点,然后分别对左右子树进行递归调用来遍历整个树。 - **分治算法**:快速排序、归并排序等排序算法利用了递归。快速...

    题目:编写递归算法,将二叉树中所有结点的左右子树相互交换 - READ.doc

    该算法的核心是使用递归函数来交换二叉树中所有结点的左右子树,从而实现树形结构中结点的交换。该算法的设计和实现主要涉及到树形结构、递归函数和指针操作等多个方面。 二、树形结构知识点 * 树形结构是一种常用...

    递归形成树形结构.txt

    javascript递归形成树形结构

    树形结构算法 PHP方面

    在这个主题中,我们将深入探讨"树形结构算法",特别是"毗邻目录模式"或称"递归模式算法"。 首先,我们需要理解树形结构的基本概念。在计算机科学中,树形结构是一种非线性的数据结构,由节点(也称为顶点)和边(也...

    e语言-易语言递归算法画树

    5. **层次感**:为了表现树的层次,可以在递归调用时调整子节点的相对位置,比如通过偏移x坐标来使树形结构向右下方扩展。 6. **性能优化**:由于递归可能导致大量的函数调用,注意控制递归深度,避免栈溢出。在...

    分形递归算法实现分叉树

    分形递归算法是一种在计算机科学中广泛应用的数学方法,特别是在图形生成、图像处理和复杂系统建模等领域。分形,简单来说,是指那些在不同尺度上具有自相似性的几何形状或模式。它们通常展现出无穷的细节,即使放大...

Global site tag (gtag.js) - Google Analytics