有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中比较列表映射中每个对象的性能

我有一个Java程序,其映射类型为<String, Project>,其中包含所有项目对象,项目的每个对象都包含一个相关流程对象列表,即List<Process>

public class Project {
    private String name;
    private Path path;
    private List<Process> processes;
        \\ getters and setters follow

public class Process {
    private String name;
    private String path;
    private String flow;
        \\getters and setters follow

我正在编写一个函数来查找每个Process(跨所有项目)的flow之间的字符串距离(使用JaroWinklerDistance)。我得出了以下结论:

    public void compareAllProcesses(Map<String, Project> projects) {
        Iterator<Project> projIter1 = projects.values().iterator();
        while(projIter1.hasNext()) {
            Project proj1 = projIter1.next();
            Iterator<Process> procIter1 = proj1.getProcesses().iterator();
            while(procIter1.hasNext()) {
                Process proc1 = procIter1.next();
                Iterator<Project> projIter2 = projects.values().iterator();
                while(projIter2.hasNext()) {
                    Project proj2 = projIter2.next();
                    Iterator<Process> procIter2 = proj2.getProcesses().iterator();
                    while(procIter2.hasNext()) {
                        Process proc2 = procIter2.next();
                        //use JaroWinklerDistance to compare proc1.getFlow() with proc2.getFLow()
                    }
                }
            }
        }
    }

有没有一种更有效、更优雅的方法来实现这一点


共 (3) 个答案

  1. # 1 楼答案

    可能与Stream有关:

    projects.values()
            .stream()
            .flatMap(p->p.getProcesses().stream())
            .forEach(proc1 ->  projects.values()
                                       .stream()
                                       .flatMap(p->p.getProcesses().stream())
                                       .forEach(proc2 -> {/*do something with proc1 and proc2*/});
    
  2. # 2 楼答案

    List<Process> allProcesses = projects.values()
        .stream()
        .flatMap(p->p.getProcesses().stream());
    
    for (Process currentProcess : allProcesses) {
        for (Process process : allProcesses) {
            //distance calculation
        }
    }
    
  3. # 3 楼答案

    也许加一点糖:

        for (Project proj1: projects.values()) {
            for (Process proc1: proj1.getProcesses()) {
                for(Project proj2: projects.values()) {
                    for(Process proc2: proj2.getProcesses()) {
                        //use JaroWinklerDistance to compare proc1.getFlow() with proc2.getFLow()
                    }
                }
            }
        }