首页 > 编程语言 >Java如何在树结构上做模糊查询

Java如何在树结构上做模糊查询

时间:2024-03-12 09:59:20浏览次数:22  
标签:node addChild TreeNode 树结构 child 查询 new Java 节点

开发企业后台管理应用时,经常会遇到一种场景:在树结构上做模糊查询。
比如:公司组织架构树、分类树等,通常是在页面上的文本框中输入一个关键字,例如"数据",然后在公司组织架构树中过滤出名字包含数据的部门,且保持树结构不变。
公司的一级部门、二级部门、三级部门等等,名字都有可能包含"数据",比如一级部门叫大数据部门,二级部门叫数据分析部门或数据开发部门等等,这些都是符合要求的。

下面我将造出一个简单的分类树,并实现在树结构上模糊查询的功能(这里为了简单,将树的层级固定为三级,但实际上树的层级是未知的且远远不止三级,那就需要用到递归了)。

package cc.oyz.netty;


import java.util.ArrayList;
import java.util.List;

class TreeNode {
    int id; // 节点ID
    String name; // 节点名称
    int parentId; // 父节点ID
    List<TreeNode> children; // 子节点列表

    // 构造函数
    public TreeNode(int id, String name, int parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
        this.children = new ArrayList<>(); // 初始化子节点列表
    }

    // 添加子节点方法
    public void addChild(TreeNode child) {
        children.add(child);
    }

    // 模糊搜索方法,返回符合条件的节点列表
    public List<TreeNode> fuzzySearch(String query) {
        List<TreeNode> results = new ArrayList<>(); // 存储搜索结果
        fuzzySearchHelper(this, query, results); // 调用搜索辅助方法
        return results;
    }

    // 判断节点是否有子节点的方法
    private boolean hasLeaf(TreeNode node) {
        for (TreeNode child : node.children) {
            if (child.children.isEmpty()) { // 如果存在叶子节点,返回true
                return true;
            }
        }
        return false; // 否则返回false
    }

    // 判断节点的子节点是否存在符合条件的节点的方法
    private boolean hasMatchingChild(TreeNode node, String query) {
        for (TreeNode child : node.children) {
            if (child.name.contains(query) || hasMatchingChild(child, query)) {
                return true; // 如果子节点的名称包含查询字符串,或者子节点的子节点存在符合条件的节点,则返回true
            }
        }
        return false; // 否则返回false
    }

    // 递归搜索辅助方法
    private void fuzzySearchHelper(TreeNode node, String query, List<TreeNode> results) {
        // 如果当前节点的值包含查询字符串,并且至少有一个子节点也符合查询条件,则将其添加到结果列表中
        if (node.name.contains(query) || hasMatchingChild(node, query)) {
            results.add(node);
        }

        // 递归搜索子节点
        List<TreeNode> removableChildren = new ArrayList<>();
        for (TreeNode child : node.children) {
            fuzzySearchHelper(child, query, results);
            if (!hasLeaf(child)) {
                removableChildren.add(child);
            }
        }

        // 删除没有树叶的子节点
        for (TreeNode child : removableChildren) {
            node.children.remove(child);
        }
    }
}

package cc.oyz.netty;

import org.junit.Test;
import java.util.List;

public class TreeTest {

    @Test
    public void test1(){

        // 创建一个示例树
        TreeNode root = new TreeNode(1, "root", 0);
        TreeNode node1 = new TreeNode(2, "node1", 1);
        TreeNode node2 = new TreeNode(3, "node2", 1);
        TreeNode node3 = new TreeNode(4, "node3", 3);
        TreeNode node4 = new TreeNode(5, "node4", 3);
        TreeNode subnode1 = new TreeNode(6, "subnode1", 2);
        TreeNode subnode2 = new TreeNode(7, "subnode2", 2);

        TreeNode node8 = new TreeNode(8, "研发部门", 1);
        TreeNode node9 = new TreeNode(9, "张三", 1);
        TreeNode node10 = new TreeNode(10, "李四", 8);
        TreeNode node11 = new TreeNode(11, "王五", 1);

        TreeNode node12 = new TreeNode(12, "销售部门", 1);
        TreeNode node13 = new TreeNode(13, "小朱", 1);
        TreeNode node14 = new TreeNode(14, "米工", 8);
        TreeNode node15 = new TreeNode(15, "小武", 1);

        root.addChild(node1);
        root.addChild(node2);
        root.addChild(node8);
        root.addChild(node12);
        node1.addChild(subnode1);
        node1.addChild(subnode2);
        node2.addChild(node3);
        node2.addChild(node4);
        node8.addChild(node9);
        node8.addChild(node10);
        node8.addChild(node11);
        node12.addChild(node13);
        node12.addChild(node14);
        node12.addChild(node15);

        // 在树中进行模糊搜索
        List<TreeNode> searchResults = root.fuzzySearch("武");

        // 打印搜索结果
        System.out.println("搜索结果:");
        for (TreeNode result : searchResults) {
            System.out.println("ID: " + result.id + ", Name: " + result.name);
        }

    }

}

假如查询的关键字是“武”,运行,输出结果如下:

image

假如查询的关键字是“1”,运行,输出结果如下:

image

标签:node,addChild,TreeNode,树结构,child,查询,new,Java,节点
From: https://www.cnblogs.com/haolb123/p/18067634

相关文章

  • UVM宏解释+odt文件转doc+merge命令和difflib+python调用命令+clog2和系统函数+java添
    UVM宏解释UVM_DISABLE_AUTO_ITEM_RECORDINGhttps://blog.csdn.net/MGoop/article/details/127295965itemrecord的方法主要是用于记录事务信息的,原理是调用accept_tr,begin_tr,end_tr。似乎和波形上显示出各个事务相关。默认情况下,在调用get_next_item()和item_done()时自动......
  • Java线上诊断神器Arthas:常用命令详解!
    有关Arthas基本介绍、安装部署、arthasidea插件在上篇文章已经介绍过,这里就不在重述。文章地址:Java诊断工具Arthas:开篇之watch实战上篇重点讲了watch命令。这篇把剩余一些重要命令讲解演示下。一、trace命令作用:展示方法内部调用路径,并输出方法路径上的每个节点上耗时......
  • JAVA常用类--System类
    System类System是一个在Java开发过程中最常见的一种系统类主要特点:可以直接执行一些系统命令例如:“System.out.println()"就是System类的一种功能本次观察以下几个方法的使用:方法名类型描述publicstaticvoidarraycopy(Objectsrc,intsrcPos,Objectd......
  • Java2024-Day01回顾
    publicclassInfo{   publicstaticvoidmain(String[]args){System.out.println("这里是Java2024-Day01")}}1.基本数据类型介绍整数:byte-short-int(默认)-long浮点型:float-double(默认)  后面跟F或f字符型:char:①chara ='XXXX';②char......
  • JAVA常用类--AutoCloseable接口
    AutoCloseable接口自动关闭,释放资源机制在实际的项目开发过程中,一般都有可能连接到一些资源,比如:文件资源、网络资源、数据库资源,在实际项目之中进行资源访问的社会一般有如下几个操作步骤:不使用AutoCLoseable:手动定义关闭函数按照正常的结构设计来讲,当前的程序已经可以满足......
  • JAVA常用类--Cleaner类
    Cleaner类注意:在JDK1.9以上版本可使用在Java程序中提供有GC的垃圾回收机制,如果发现堆内存不足时一定要进行垃圾回收以释放内存空间但如果某些对象在回收前需要做一些处理,可以通过覆写Object类中的finalize()方法来实现这种回收前的处理finalize()方法的定义:@Deprecated(sin......
  • JAVA常用类--Runtime类
    Runtime类Runtime类描述的是一种运行时,在Java程序执行过程中,所有的java程序都一定要运行在JVM(虚拟机)的进程中有了JVM进程,就需要一种类型可以描述当前进程的相关环境以及与之相关的处理操作,即Java设计出了Runtime类每个JVM的进程中都会自动包含有一个Runtime类的实例化对象,打......
  • 贴现率计算程序(java)
    折现率公式: CF0:成本CFi:第i期收入金额r:折现率java代码:importjava.util.ArrayList;importjava.util.Scanner;publicclassTest{publicstaticdoublecalculateNPV(doubleinitialInvestment,ArrayList<Double>cashFlows,doublediscountRate){......
  • Java HashMap 和 HashSet 的高效使用技巧
    JavaHashMapHashMap是一种哈希表,它存储键值对。键用于查找值,就像数组中的索引一样。HashMap的优势在于它可以使用任何类型作为键,并且查找速度很快。创建HashMap//导入HashMap类importjava.util.HashMap;publicclassMain{publicstaticvoidmain(String[]a......
  • flowable的查询操作和删除操作
    效果图 pom文件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http......