java 用递归实现球上下级(牵涉到对上级的去重)

1:最近遇到一个问题需要用到SparkStreaming 算出某个角色的所有的上级,同时当上级的等级相同的时候需要去重。我想到了用递归去实现
数据描述:自己的id, 等级, 父节点的id。数据呈现为树结构
package org.training.shiyanlou;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * Created by chaozhang on 2018/2/2.
 *
 * 最近遇到一个问题需要用到SparkStreaming 算出某个角色的所有的上级,同时党上级的等级数是一样的时候第一个才有效,
 * 我想到了用递归实现。
 * 一 JAVA 递归算法
 */
public class DiGui {
    // 存放此人的所有leader,
    private  static ArrayList leadList = new ArrayList();
    // 模拟出所有人的关系,key代表id, value由leader的id和自己的等级(level)构成。
    private static HashMap map = new HashMap();

    public static void main(String[] args) {


        // 模拟出所有人的关系
       //key代表id, value由leader的id和自己的等级(level)构成。
        map.put(1,"2|a");// id为1的leader ID为2
        map.put(2,"3|c");
        map.put(3,"4|c");
        map.put(4,"5|c");
        map.put(5,"6|d");
        map.put(6,"-1|e");// -1代表此人没有leader


        fun2(1,"-a");// 找出lev的所有leader, -a是一个特殊的等级,代表是循环查询的入口,
        System.out.println("==========此人的所有leader的上级如下================");
        for(Integer id: leadList){//第一条数据就是本人,需要丢弃掉
            System.out.println(id);
        }
    }

// 问题2 : 迭代出某人的所有上级,存入一个list中。用一个map去模拟上级的关系。key代表本人id, value 代表leader的id
    public static void fun2(Integer ownKey, String sonLevel){
        String[] value = map.get(ownKey).split("\\|");

        // 父级ID
        Integer fatherID = Integer.parseInt(value[0]);
        //自己的等级
        String ownLevel =  value[1];
        if (fatherID == -1){// 没有leader 递归结束
            if(!ownLevel.equals( sonLevel) ) {
                leadList.add(ownKey);
            }
        }else {
            if(!ownLevel.equals( sonLevel) ) { // 子几点与父节点的等级不同的数据才有效
                leadList.add(ownKey);
            }
            fun2(fatherID, ownLevel);
        }

    }

}


你可能感兴趣的:(java,算法)