java - 查找层次结构

标签 java java-8

让我们考虑一个java类

class Entity  {

Integer id;
Integer parentId;

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public Integer getParentId() {
    return parentId;
}

public void setParentId(Integer parentId) {
    this.parentId = parentId;
}


}
 }

将 parentId 视为外键(与另一个对象的 id 相关)。

现在我创建了 6 个对象并放置了一些值。

Entity e1 = new Entity();
    e1.setId(400);

    Entity e2 = new Entity();
    e2.setId(300);
            e2.setParentId(400);

    Entity e3 = new Entity();
    e3.setId(200);
    e3.setParentId(300);

    Entity e4 = new Entity();
    e4.setId(100);
            e4.setParentId(200);

    Entity e5 = new Entity();
    e5.setId(50);
            e5.setParentId(100);

    Entity e6 = new Entity();
    e6.setParentId(50);

现在我想获取对象的层次结构。这意味着如果我给出 id,我应该得到完整的父层次结构和子层次结构。

例如:如果我将 100 作为 id(entity: e4),我应该得到父层次结构:- e4,e3,e2,e1 子层级:- e4,e5,e6

说明:- 对于父层次结构:- 我们应该首先添加初始的 e4 对象。然后我们将找到其iD与e4的parentId相同的对象。(这里是e3)该过程继续直到parentid为null 对于子层次结构:- 我们应该首先添加初始的 e4 对象。然后我们会找到其parentId与e4的id相同的对象。 (这里是 e5)这个过程一直持续到 parentid 为 null

由我解决 对于父层次结构:-

 List<Entity> parent = new ArrayList<Entity>();

    Entity ent = list.stream().filter(e -> e.getId() == 100).findFirst()
            .get(); // // 100 input id value

    parent.add(ent);

    Integer parentId = ent.getParentId();

    while (parentId != null) {

        int search = parentId;
        Entity newEntity = list.stream().filter(e -> e.getId() == search)
                .findFirst().get();

        parent.add(newEntity);
        parentId = newEntity.getParentId();
    }

对于子层级:

    Entity entnew = list.stream().filter(e -> e.getId() == 100).findFirst()
            .get(); // 100 input id value



    child.add(entnew);


    Integer idNew = entnew.getId();


    while (idNew != null) {

    int searchNew = idNew;

    Entity newEnt = list.stream().filter(f -> f.getParentId()!= null && f.getParentId() == searchNew)
            .findFirst().get();

    child.add(newEnt);
    idNew = newEnt.getId();

    }

我找到了这个方法来解决这个场景,但我想在 java 8 中使用它的核心概念更有效的解决方案来解决这个问题。

最佳答案

我找到了一个更像 Java8 的解决方案,带有函数式编程的味道。

给定您的六个实体(请注意,我已经为 e6 设置了 Id,否则我们会得到一个 NullPointerException):

Entity e1 = new Entity();
e1.setId(400);

Entity e2 = new Entity();
e2.setId(300);
e2.setParentId(400);

Entity e3 = new Entity();
e3.setId(200);
e3.setParentId(300);

Entity e4 = new Entity();
e4.setId(100);
e4.setParentId(200);

Entity e5 = new Entity();
e5.setId(50);
e5.setParentId(100);

Entity e6 = new Entity();
e6.setId(25); // this Id must be set, or we'll get a NPE
e6.setParentId(50);

以及包含它们的列表:

List<Entity> list = new ArrayList<>();
list.add(e1);
list.add(e2);
list.add(e3);
list.add(e4);
list.add(e5);
list.add(e6);

然后,对于父层次结构:

Function<Integer, Entity> byId = 
    id -> list.stream()
        .filter(e -> e.getId().equals(id))
        .findFirst()
        .orElse(null);

Entity parentsSeed = byId.apply(100); // e4

UnaryOperator<Entity> nextParent = 
    e -> e == null ? e : byId.apply(e.getParentId());

List<Entity> parents = 
    Stream.iterate(parentsSeed, nextParent)
        .limit(list.size())
        .filter(Objects::nonNull)
        .collect(Collectors.toList()); // [e4, e3, e2, e1]

对于子层级:

Entity childrenSeed = byId.apply(100); // e4

Function<Integer, Entity> byParentId = 
    id -> list.stream()
        .filter(e -> id.equals(e.getParentId()))
        .findFirst()
        .orElse(null);

UnaryOperator<Entity> nextChild = 
    e -> e == null ? e : byParentId.apply(e.getId());

List<Entity> children = 
    Stream.iterate(childrenSeed, nextChild)
        .limit(list.size())
        .filter(Objects::nonNull)
        .collect(Collectors.toList()); // [e4, e5, e6]

想法是使用 Stream.iterate()方法,通过“功能性”迭代创建流。

对于 parent ,我创建了一个 UnaryOperator (一个函数)给定一个 Entity , 返回其父级 Entitynull ;对于 children ,我创建了一个 UnaryOperator那,给定一个 Entity , 返回它的 child Entitynull .

为了执行这两个搜索,我使用了另一个 Function它只是搜索 list通过 idparentId , 分别。

关于java - 查找层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31407318/

相关文章:

java - 使用 ImageIO.write 保存文件 (JPG) 时处理 java.awt.Color

java - Java 中的 IncompatibleClassChangeError

java - 将列表值流式传输到 Map.Entry.values

javascript - Java Nashorn 存储函数

java - 删除 junit 测试以在 ant 中构建

java - redis.clients.jedis.exceptions.JedisConnectionException : java.net.UnknownHostException

java.lang.AbstractMethodError : abstract method not implemented

java - Dijkstra 算法模拟

java - IntelliJ - 无法导航到 JDK 目录

java - Quartz 属性文件传入环境变量