diff --git a/itstack-demo-design-15-00/pom.xml b/itstack-demo-design-15-00/pom.xml new file mode 100644 index 00000000..517d6b1a --- /dev/null +++ b/itstack-demo-design-15-00/pom.xml @@ -0,0 +1,15 @@ + + + + itstack-demo-design + org.itstack + 1.0-SNAPSHOT + + 4.0.0 + + itstack-demo-design-15-00 + + + \ No newline at end of file diff --git a/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/group/Employee.java b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/group/Employee.java new file mode 100755 index 00000000..6e772cf7 --- /dev/null +++ b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/group/Employee.java @@ -0,0 +1,47 @@ +package org.itstack.demo.design.group; + +/** + * 雇员 + */ +public class Employee { + + private String uId; // ID + private String name; // 姓名 + private String desc; // 备注 + + public Employee(String uId, String name) { + this.uId = uId; + this.name = name; + } + + public Employee(String uId, String name, String desc) { + this.uId = uId; + this.name = name; + this.desc = desc; + } + + public String getuId() { + return uId; + } + + public void setuId(String uId) { + this.uId = uId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + +} diff --git a/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/group/GroupStructure.java b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/group/GroupStructure.java new file mode 100755 index 00000000..3431e880 --- /dev/null +++ b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/group/GroupStructure.java @@ -0,0 +1,103 @@ +package org.itstack.demo.design.group; + +import org.itstack.demo.design.lang.Collection; +import org.itstack.demo.design.lang.Iterator; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class GroupStructure implements Collection { + + private String groupId; // 组织ID,也是一个组织链的头部ID + private String groupName; // 组织名称 + private Map employeeMap = new ConcurrentHashMap(); // 雇员列表 + private Map> linkMap = new ConcurrentHashMap>(); // 组织架构关系;id->list + private Map invertedMap = new ConcurrentHashMap(); // 反向关系链 + + public GroupStructure(String groupId, String groupName) { + this.groupId = groupId; + this.groupName = groupName; + } + + public boolean add(Employee employee) { + return null != employeeMap.put(employee.getuId(), employee); + } + + public boolean remove(Employee o) { + return null != employeeMap.remove(o.getuId()); + } + + public boolean addLink(String key, Link link) { + invertedMap.put(link.getToId(), link.getFromId()); + if (linkMap.containsKey(key)) { + return linkMap.get(key).add(link); + } else { + List links = new LinkedList(); + links.add(link); + linkMap.put(key, links); + return true; + } + } + + public boolean removeLink(String key) { + return null != linkMap.remove(key); + } + + public Iterator iterator() { + + return new Iterator() { + + HashMap keyMap = new HashMap(); + + int totalIdx = 0; + private String fromId = groupId; // 雇员ID,From + private String toId = groupId; // 雇员ID,To + + public boolean hasNext() { + return totalIdx < employeeMap.size(); + } + + public Employee next() { + List links = linkMap.get(toId); + int cursorIdx = getCursorIdx(toId); + + // 同级节点扫描 + if (null == links) { + cursorIdx = getCursorIdx(fromId); + links = linkMap.get(fromId); + } + + // 上级节点扫描 + while (cursorIdx > links.size() - 1) { + fromId = invertedMap.get(fromId); + cursorIdx = getCursorIdx(fromId); + links = linkMap.get(fromId); + } + + // 获取节点 + Link link = links.get(cursorIdx); + toId = link.getToId(); + fromId = link.getFromId(); + totalIdx++; + + // 返回结果 + return employeeMap.get(link.getToId()); + } + + public int getCursorIdx(String key) { + int idx = 0; + if (keyMap.containsKey(key)) { + idx = keyMap.get(key); + keyMap.put(key, ++idx); + } else { + keyMap.put(key, idx); + } + return idx; + } + }; + } + +} diff --git a/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/group/Link.java b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/group/Link.java new file mode 100755 index 00000000..f9ae4aa9 --- /dev/null +++ b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/group/Link.java @@ -0,0 +1,32 @@ +package org.itstack.demo.design.group; + +/** + * 树节点链路 + */ +public class Link { + + private String fromId; // 雇员ID + private String toId; // 雇员ID + + public Link(String fromId, String toId) { + this.fromId = fromId; + this.toId = toId; + } + + public String getFromId() { + return fromId; + } + + public void setFromId(String fromId) { + this.fromId = fromId; + } + + public String getToId() { + return toId; + } + + public void setToId(String toId) { + this.toId = toId; + } + +} diff --git a/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/lang/Collection.java b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/lang/Collection.java new file mode 100755 index 00000000..8a78b290 --- /dev/null +++ b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/lang/Collection.java @@ -0,0 +1,15 @@ +package org.itstack.demo.design.lang; + +public interface Collection extends Iterable { + + boolean add(E e); + + boolean remove(E e); + + boolean addLink(String key, L l); + + boolean removeLink(String key); + + Iterator iterator(); + +} diff --git a/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/lang/Iterable.java b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/lang/Iterable.java new file mode 100755 index 00000000..1e048298 --- /dev/null +++ b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/lang/Iterable.java @@ -0,0 +1,7 @@ +package org.itstack.demo.design.lang; + +public interface Iterable { + + Iterator iterator(); + +} diff --git a/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/lang/Iterator.java b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/lang/Iterator.java new file mode 100755 index 00000000..db08cafe --- /dev/null +++ b/itstack-demo-design-15-00/src/main/java/org/itstack/demo/design/lang/Iterator.java @@ -0,0 +1,9 @@ +package org.itstack.demo.design.lang; + +public interface Iterator { + + boolean hasNext(); + + E next(); + +} diff --git a/itstack-demo-design-15-00/src/test/java/org/itstack/demo/design/test/ApiTest.java b/itstack-demo-design-15-00/src/test/java/org/itstack/demo/design/test/ApiTest.java new file mode 100755 index 00000000..b9ea03ae --- /dev/null +++ b/itstack-demo-design-15-00/src/test/java/org/itstack/demo/design/test/ApiTest.java @@ -0,0 +1,46 @@ +package org.itstack.demo.design.test; + +import com.alibaba.fastjson.JSON; +import org.apache.commons.lang3.StringUtils; +import org.itstack.demo.design.group.Employee; +import org.itstack.demo.design.group.GroupStructure; +import org.itstack.demo.design.group.Link; +import org.itstack.demo.design.lang.Iterator; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ApiTest { + + private Logger logger = LoggerFactory.getLogger(ApiTest.class); + + @Test + public void test_iterator() { + GroupStructure groupStructure = new GroupStructure("1", "小傅哥"); + groupStructure.add(new Employee("2", "花花", "二级部门")); + groupStructure.add(new Employee("3", "豆包", "二级部门")); + groupStructure.add(new Employee("4", "蹦蹦", "三级部门")); + groupStructure.add(new Employee("5", "大烧", "三级部门")); + groupStructure.add(new Employee("6", "虎哥", "四级部门")); + groupStructure.add(new Employee("7", "玲姐", "四级部门")); + groupStructure.add(new Employee("8", "秋雅", "四级部门")); + + groupStructure.addLink("1", new Link("1", "2")); + groupStructure.addLink("1", new Link("1", "3")); + + groupStructure.addLink("2", new Link("2", "4")); + groupStructure.addLink("2", new Link("2", "5")); + + groupStructure.addLink("5", new Link("5", "6")); + groupStructure.addLink("5", new Link("5", "7")); + groupStructure.addLink("5", new Link("5", "8")); + + Iterator iterator = groupStructure.iterator(); + while (iterator.hasNext()) { + Employee employee = iterator.next(); + logger.info("{},雇员 Id:{} Name:{}", employee.getDesc(), employee.getuId(), employee.getName()); + } + + } + +} diff --git a/pom.xml b/pom.xml index ebc76393..138e3f17 100755 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,7 @@ itstack-demo-design-14-00 itstack-demo-design-14-01 itstack-demo-design-14-02 + itstack-demo-design-15-00