Сравнение каждого объекта на карте списков в Java - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть Java-программа с картой типа <String, Project>, которая содержит все объекты Project, а каждый объект Project содержит список связанных объектов Process, т. Е. List<Process>.

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

и * 1006.*

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

Я пишу функцию для определения расстояния строки (используя JaroWinklerDistance) между flow каждого Process (во всех проектах).Я придумал следующее:

    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 ]

0 голосов
/ 19 февраля 2019

С небольшим количеством сахара, возможно:

    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()
                }
            }
        }
    }
0 голосов
/ 19 февраля 2019
List<Process> allProcesses = projects.values()
    .stream()
    .flatMap(p->p.getProcesses().stream());

for (Process currentProcess : allProcesses) {
    for (Process process : allProcesses) {
        //distance calculation
    }
}
0 голосов
/ 19 февраля 2019

Возможно с 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*/});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...