【问题标题】:Comparing every object in a Map of Lists in Java比较Java中列表映射中的每个对象
【发布时间】:2019-07-12 14:02:07
【问题描述】:

我有一个 Java 程序,其类型为 <String, Project> 的 Map 包含所有 Project 对象,并且 Project 的每个对象都包含一个相关 Process 对象的列表,即 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

我正在编写一个函数来查找每个flow 之间的字符串距离(使用JaroWinklerDistanceProcess(在所有项目中)。我想出了以下几点:

    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()
                    }
                }
            }
        }
    }

有没有更高效、更优雅的方式来实现这一点?

【问题讨论】:

  • 比较到底是什么意思?你想从比较中得到什么?
  • @Kartik 我已经编辑了我的帖子以指定我希望进行的比较
  • 您确定要将每个进程与其他进程进行比较吗?表现会很差。对于 10 个项目,每个项目有 10 个流程,这将是 10k 次比较。

标签: java performance arraylist hashmap iterator


【解决方案1】:

也许Streams:

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】:

    也许加点糖:

        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()
                    }
                }
            }
        }
    

    【讨论】:

      【解决方案3】:
      List<Process> allProcesses = projects.values()
          .stream()
          .flatMap(p->p.getProcesses().stream());
      
      for (Process currentProcess : allProcesses) {
          for (Process process : allProcesses) {
              //distance calculation
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 1970-01-01
        • 2017-04-10
        • 2013-03-14
        • 2019-09-18
        • 1970-01-01
        相关资源
        最近更新 更多