1
votes

Comparaison de chaque objet dans une carte de listes en Java

J'ai un programme Java avec une carte de type qui contient tous les objets Project et chaque objet de Project contient une liste d'objets Process associés, c'est-à-dire List .

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

et

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

J'écris une fonction pour trouver la distance de chaîne (en utilisant JaroWinklerDistance ) entre le flux de chaque Process (dans tous les projets). J'ai proposé ce qui suit:

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

Existe-t-il un moyen plus efficace et plus élégant d'y parvenir?


4 commentaires

qu'entendez-vous exactement par comparaison? que voulez-vous obtenir par comparaison?


Ceci est un doublon possible de stackoverflow.com/questions/4994021/...


@Kartik J'ai édité mon article pour spécifier la comparaison que je souhaite faire


Voulez-vous vraiment comparer chaque processus avec tous les autres processus? La performance de ça va être vraiment mauvaise. Pour 10 projets avec 10 processus chacun, ce sera 10k comparaisons.


3 Réponses :


2
votes

Peut-être avec 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*/});


0 commentaires

0
votes

Avec un peu de sucre peut-être:

    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 commentaires

0
votes
List<Process> allProcesses = projects.values()
    .stream()
    .flatMap(p->p.getProcesses().stream());

for (Process currentProcess : allProcesses) {
    for (Process process : allProcesses) {
        //distance calculation
    }
}

0 commentaires