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<Integer> leadList = new ArrayList<Integer>();
// 模拟出所有人的关系,key代表id, value由leader的id和自己的等级(level)构成。
private static HashMap<Integer,String> map = new HashMap<Integer, String>();
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);
}
}
}