「java递归查找」java递归查找所有根节点

博主:adminadmin 2022-12-26 01:03:07 84

本篇文章给大家谈谈java递归查找,以及java递归查找所有根节点对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java的递归查询怎么写

原文在这里,写得不错,楼主可参考下,具体链接如下,我只是搬运工!

/** 

    * 说明方法描述:将list转为树tree结构 

    *  

    * @param allRrecords 

    * @return 

    * @time 2016年5月10日 下午6:00:35 

    * @author yangdong 

    */  

   public ListRecord useListRecordToTree(ListRecord allRrecords) {  

  

       ListRecord listParentRecord = new ArrayListRecord();  

       ListRecord listNotParentRecord = new ArrayListRecord();  

       // 第一步:遍历allRrecords保存所有数据的uuid用于判断是不是根节点  

       MapString, String mapAllUuid = new HashMapString, String();  

       MapString, Record allRecordMap = new HashMapString, Record();  

       for (Record record : allRrecords) {  

           mapAllUuid.put(record.getStr("uuid"), record.getStr("uuid"));  

           allRecordMap.put(record.getStr("uuid"), record);  

       }  

       // 第二步:遍历allRrecords找出所有的根节点和非根节点  

       if (allRrecords != null  allRrecords.size()  0) {  

           for (Record record : allRrecords) {  

               if (StringUtil.isBlank(record.getStr("parent_uuid"))  

                   || !mapAllUuid.containsKey(record.getStr("parent_uuid"))) {  

                   listParentRecord.add(record);  

               } else {  

                   listNotParentRecord.add(record);  

               }  

           }  

       }  

  

       // 第三步: 递归获取所有子节点  

       if (listParentRecord.size()  0) {  

           for (Record record : listParentRecord) {  

               // 添加所有子级  

               record.set("childs", this.getTreeChildRecord(listNotParentRecord, record.getStr("uuid")));  

           }  

       }  

       return listParentRecord;  

   }  

  

   /** 

    * 说明方法描述:使list转换为树并根据关键字和节点名称过滤 

    *  

    * @param allRecords 所有节点 

    * @param keywords 要过滤的关键字 

    * @param filterFields 要过滤的字段 

    * @return 

    * @time 2016年5月19日 下午3:27:32 

    * @author yangdong 

    */  

   public ListRecord useListRecordToTreeByKeywords(ListRecord allRecords, String keywords, String... filterFields) {  

       ListRecord listRecord = new ArrayListRecord();  

       MapString, Record allRecordMap = new HashMapString, Record();  

       for (Record record : allRecords) {  

           allRecordMap.put(record.getStr("uuid"), record);  

       }  

       // 遍历allRrecords找出所有的nodeName和关键字keywords相关的数据  

       if (allRecords != null  allRecords.size()  0) {  

           if (filterFields.length  1) {  

               for (Record record : allRecords) {  

                   for (String field : filterFields) {  

                       // 比较  

                       if (record.getStr(field).toLowerCase().indexOf(keywords.toLowerCase()) != -1) {  

                           listRecord.add(record);  

                       }  

                   }  

               }  

           } else {  

               for (Record record : allRecords) {  

                   // 比较  

                   if (record.getStr(filterFields[0]).toLowerCase().indexOf(keywords.toLowerCase()) != -1) {  

                       listRecord.add(record);  

                   }  

               }  

           }  

       }  

       // 查找过滤出来的节点和他们的父节点  

       listRecord = this.getSelfAndTheirParentRecord(listRecord, new ArrayListRecord(),  

                                                     new HashMapString, Record(), allRecordMap);  

       // 将过滤出来的数据变成树tree结构  

       listRecord = this.useListRecordToTree(listRecord);  

       return listRecord;  

   }  

  

   /** 

    * 说明方法描述:递归查询子节点 

    *  

    * @param childList 子节点 

    * @param parentUuid 父节点id 

    * @return 

    * @time 2016年5月10日 下午3:29:35 

    * @author yangdong 

    */  

   private ListRecord getTreeChildRecord(ListRecord childList, String parentUuid) {  

       ListRecord listParentRecord = new ArrayListRecord();  

       ListRecord listNotParentRecord = new ArrayListRecord();  

       // 遍历tmpList,找出所有的根节点和非根节点  

       if (childList != null  childList.size()  0) {  

           for (Record record : childList) {  

               // 对比找出父节点  

               if (StringUtil.equals(record.getStr("parent_uuid"), parentUuid)) {  

                   listParentRecord.add(record);  

               } else {  

                   listNotParentRecord.add(record);  

               }  

  

           }  

       }  

       // 查询子节点  

       if (listParentRecord.size()  0) {  

           for (Record record : listParentRecord) {  

               // 递归查询子节点  

               record.set("childs", getTreeChildRecord(listNotParentRecord, record.getStr("uuid")));  

           }  

       }  

       return listParentRecord;  

   }  

  

   /** 

    * 说明方法描述:递归找出本节点和他们的父节点 

    *  

    * @param parentList 根据关键字过滤出来的相关节点的父节点 

    * @param resultList 返回的过滤出来的节点 

    * @param filterRecordMap 已经过滤出来的节点 

    * @param allRecordMap 所有节点 

    * @return 

    * @time 2016年5月19日 上午9:53:56 

    * @author yangdong 

    */  

   private ListRecord getSelfAndTheirParentRecord(ListRecord parentList, ListRecord resultList,  

                                                    MapString, Record filterRecordMap,  

                                                    MapString, Record allRecordMap) {  

       // 当父节点为null或者节点数量为0时返回结果,退出递归  

       if (parentList == null || parentList.size() == 0) {  

           return resultList;  

       }  

       // 重新创建父节点集合  

       ListRecord listParentRecord = new ArrayListRecord();  

       // 遍历已经过滤出来的节点  

       for (Record record : parentList) {  

  

           String uuid = record.getStr("uuid");  

           String parent_uuid = record.getStr("parent_uuid");  

  

           // 如果已经过滤出来的节点不存在则添加到list中  

           if (!filterRecordMap.containsKey(uuid)) {  

               listParentRecord.add(record);// 添加到父节点中  

               filterRecordMap.put(uuid, record);// 添加到已过滤的map中  

               allRecordMap.remove(uuid);// 移除集合中相应的元素  

               resultList.add(record);// 添加到结果集中  

           }  

  

           // 找出本节点的父节点并添加到listParentRecord父节点集合中,并移除集合中相应的元素  

           if (StringUtil.isNotBlank(parent_uuid)) {  

               Record parentRecord = allRecordMap.get(parent_uuid);  

               if (parentRecord != null) {  

                   listParentRecord.add(parentRecord);  

                   allRecordMap.remove(parent_uuid);  

               }  

           }  

  

       }  

       // 递归调用  

       getSelfAndTheirParentRecord(listParentRecord, resultList, filterRecordMap, allRecordMap);  

  

       return resultList;  

   }  

[java] view plain copy

//示例  

[java] view plain copy

/** 

     * 说明方法描述:递归查询所有权限 

     *  

     * @param keyword 

     * @param is_deleted 

     * @return 

     * @time 2016年5月10日 下午3:47:50 

     * @author yangdong 

     */  

    public ListRecord getRecordByKeywordRecursive(String keyword, String is_deleted) {  

        // 第一步:查询所有的数据  

        StringBuffer sql = new StringBuffer(  

                                            " select pa.uuid,pa.parent_uuid,pa.author_code,pa.author_name,pa.is_menu,pa.sort_number,pa.is_enable,pa.menu_icon ");  

        sql.append("  from s_author pa");  

        ListObject params = new ArrayListObject();  

        sql.append(" where  pa.is_deleted=? ");  

        params.add(is_deleted);  

        sql.append(" order by pa.sort_number asc ");  

  

  

        ListRecord allRrecords = Db.use(AppConst.DB_DATASOURCE_MAIN).find(sql.toString(), ParamUtil.listToArray(params));  

[java] view plain copy

            //第二步:将list变为树tree结构  

        if (StringUtil.isNotBlank(keyword)) {  

            return super.useListRecordToTreeByKeywords(allRrecords, keyword, "author_name");  

        } else {  

            return super.useListRecordToTree(allRrecords);  

        }  

    }

如何在指定目录下递归查找java类文件

在进行J2EE应用开发过程中,尤其是反编译现有java字节码文件来学习和研究过程中,经常会遇到编译时找不到所引用的类,编译器报错的问题。而该类定义可能已经存在某个目录或jar文件中,所以只要找到.class文件路径将其import进去或把jar文件加入 classpath中,问题也就得到解决。

通常,包含类定义的是.class文件和.jar文件。因此,在目录下递归判断每个文件,如果是.class文件,则比较文件名和要查找的类名是否一致;如果是.jar文件,则生成一个JarFile对象,并依次判断JarFile的JarEntry是否为要查找的类,并循环判断JarFile的所有entries对象名称是否和要查找的类名一致,如果一致,则说明该jar文件包含有要查找的类。下面的代码是笔者在项目开发过程中,用于解决实际问题且非常实用的程序。

(此文为文章摘要)

java树级对象递归查找子集问题

package com.demo.dept;

/**

 * @author dongbin.yu

 * @from 2016-05-06

 * @since V1.0

 */

public class Dept {

    private int id;

    private String name;

    private int parentId;

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getParentId() {

        return parentId;

    }

    public void setParentId(int parentId) {

        this.parentId = parentId;

    }

    public Dept(int id, String name, int parentId) {

        this.id = id;

        this.name = name;

        this.parentId = parentId;

    }

}

package com.demo.dept;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

 * @author dongbin.yu

 * @from 2016-05-06

 * @since V1.0

 */

public class DeptTest {

    private static ListDept depts = new ArrayList();

    static{

        depts.add(new Dept(1,"部门1",0));

        depts.add(new Dept(2,"部门2",1));

        depts.add(new Dept(3,"部门3",1));

        depts.add(new Dept(4,"部门4",1));

        depts.add(new Dept(5,"部门5",2));

        depts.add(new Dept(6,"部门6",3));

        depts.add(new Dept(7,"部门7",2));

        depts.add(new Dept(8,"部门8",2));

        depts.add(new Dept(9,"部门9",1));

        depts.add(new Dept(10,"部门10",5));

    }

    public static void main(String[] args) {

        MapInteger, ListInteger deptMap = new HashMap();

        for (Dept dept : depts) {

            deptMap.put(dept.getId(),getChildDept(dept.getId()));

        }

        System.out.println(deptMap);

    }

    private static ListInteger getChildDept(int id){

        ListInteger ids = new ArrayList();

        for (Dept dept : depts) {

            if(dept.getParentId() == id){

                //添加第一次父id符合的

                ids.add(dept.getId());

                //添加嵌套父id符合的

                ids.addAll(getChildDept(dept.getId()));

            }

        }

                Collections.sort(ids);

        return ids;

    }

}

java二分法查找的递归算法怎么实现

什么是二分查找?

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找优缺点

优点是比较次数少,查找速度快,平均性能好;

其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

使用条件:查找序列是顺序结构,有序。

过程

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

利用循环的方式实现二分法查找

public class BinarySearch {

public static void main(String[] args) {

// 生成一个随机数组        int[] array = suiji();

// 对随机数组排序        Arrays.sort(array);

System.out.println("产生的随机数组为: " + Arrays.toString(array));

System.out.println("要进行查找的值: ");

Scanner input = new Scanner(System.in);

// 进行查找的目标值        int aim = input.nextInt();

// 使用二分法查找        int index = binarySearch(array, aim);

System.out.println("查找的值的索引位置: " + index);

}

/**     * 生成一个随机数组     *

* @return 返回值,返回一个随机数组     */

private static int[] suiji() {

// random.nextInt(n)+m  返回m到m+n-1之间的随机数        int n = new Random().nextInt(6) + 5;

int[] array = new int[n];

// 循环遍历为数组赋值        for (int i = 0; i array.length; i++) {

array[i] = new Random().nextInt(100);

}

return array;

}

/**     * 二分法查找  ---循环的方式实现     *

* @param array 要查找的数组     * @param aim 要查找的值     * @return 返回值,成功返回索引,失败返回-1     */

private static int binarySearch(int[] array, int aim) {

// 数组最小索引值        int left = 0;

// 数组最大索引值        int right = array.length - 1;

int mid;

while (left = right) {

mid = (left + right) / 2;

// 若查找数值比中间值小,则以整个查找范围的前半部分作为新的查找范围            if (aim array[mid]) {

right = mid - 1;

// 若查找数值比中间值大,则以整个查找范围的后半部分作为新的查找范围            } else if (aim array[mid]) {

left = mid + 1;

// 若查找数据与中间元素值正好相等,则放回中间元素值的索引            } else {

return mid;

}

}

return -1;

}}

运行结果演示:

由以上运行结果我们得知,如果要查找的数据在数组中存在,则输出该数据在数组中的索引;如果不存在则输出 -1 ,也就是打印 -1 则该数在数组中不存在,反之则存在。

四、利用递归的方式实现二分法查找

public class BinarySearch2 {

public static void main(String[] args) {

// 生成一个随机数组        int[] array = suiji();

// 对随机数组排序        Arrays.sort(array);

System.out.println("产生的随机数组为: " + Arrays.toString(array));

System.out.println("要进行查找的值: ");

Scanner input = new Scanner(System.in);

// 进行查找的目标值        int aim = input.nextInt();

// 使用二分法查找        int index = binarySearch(array, aim, 0, array.length - 1);

System.out.println("查找的值的索引位置: " + index);

}

/**     * 生成一个随机数组     *     * @return 返回值,返回一个随机数组     */

private static int[] suiji() {

// Random.nextInt(n)+m  返回m到m+n-1之间的随机数        int n = new Random().nextInt(6) + 5;

int[] array = new int[n];

// 循环遍历为数组赋值        for (int i = 0; i array.length; i++) {

array[i] = new Random().nextInt(100);

}

return array;

}

/**     * 二分法查找 ---递归的方式     *     * @param array 要查找的数组     * @param aim   要查找的值     * @param left  左边最小值     * @param right 右边最大值     * @return 返回值,成功返回索引,失败返回-1     */

private static int binarySearch(int[] array, int aim, int left, int right) {

if (aim array[left] || aim array[right]) {

return -1;

}

// 找中间值        int mid = (left + right) / 2;

if (array[mid] == aim) {

return mid;

} else if (array[mid] aim) {

//如果中间值大于要找的值则从左边一半继续递归            return binarySearch(array, aim, left, mid - 1);

} else {

//如果中间值小于要找的值则从右边一半继续递归            return binarySearch(array, aim, mid + 1, array.length-1);

}

}}

运行结果演示:

总结:

递归相较于循环,代码比较简洁,但是时间和空间消耗比较大,效率低。在实际的学习与工作中,根据情况选择使用。通常我们如果使用循环实现代码只要不是太繁琐都选择循环的方式实现~

JAVA的递归查询指定后缀名文件的问题

你的程序只打印指定目录下的“.java”文件,是因为dir.listFiles(new FilenameFilter());只返回过滤后的文件列表,所以返回的是指定目录下的“.java”文件

你的程序我帮你改好了,你看看吧

import java.io.*;

class test2

{

 public static void main(String[] args) 

 {

   File fi=new File("D:\\BD\\java2016");   //指定查找目录

   showdir(fi);

 }

 public static void showdir(File dir) //定义一个返回目录中所有文件的方法showdir

 {

  if(dir.isDirectory())

  {        //判断是否目录,

   File[] files=dir.listFiles(new FilenameFilter()   //定义过滤器,过滤文件类型为.java的文件

   {

    public boolean accept(File dir,String name)

    {

     return name.endsWith(".java");

    }

   });

   for(int x=0;xfiles.length;x++)        //打印以.java结尾的文件名

   {

    System.out.println(files[x]); 

   }

   File[] files1=dir.listFiles();   //定义没有过滤器的文件列表

   for(int x=0;xfiles1.length;x++)        

   {

    if(files1[x].isDirectory())   //如果是目录则递归调用showdir方法,不是目录则忽略

     showdir(files1[x]);  

   }

  }

 } 

}

java递归查询子节点,按给的示例代码实现

代码如下:

import java.util.ArrayList;

import java.util.List;

class Org {

private String id;

private String name;

private String pid;

public Org(String id, String name, String pid) {

this.id = id;

this.name = name;

this.pid = pid;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPid() {

return pid;

}

public void setPid(String pid) {

this.pid = pid;

}

@Override

public String toString() {

return "Org [id=" + id + ", name=" + name + ", pid=" + pid + "]";

}

}

public class App {

static void find(ListOrg list, String pid) {

list.stream().filter(p - p.getPid().equals(pid))

.forEach(org - {

System.out.println(org);

find(list, org.getId());

});

}

public static void main(String[] args) {

ListOrg list = new ArrayList();

list.add(new Org("111", "公司", "0"));

list.add(new Org("222", "部门", "111"));

list.add(new Org("333", "小组", "222"));

list.add(new Org("444", "员工1", "333"));

list.add(new Org("555", "员工2", "333"));

find(list, "0");

System.out.println("------------------------------------");

find(list, "111");

}

}

运行结果:

关于java递归查找和java递归查找所有根节点的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-26,除非注明,否则均为首码项目网原创文章,转载请注明出处。