Calculer distance euclidienne

jj1k Messages postés 32 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour

j'ai un fichier txt qui contient une liste des villes à partir des coordonées X et Y je veux calculer la distance euclidiene entre tou les ville



comment je peux le faire ?
Merci

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    Rien de nouveau par rapport à tes autres discussions, tu lis ton fichier texte ligne par ligne, tu map avec des objets représentant chaque ligne et tu agrèges les résultats...

    import java.awt.Point;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.List;
    import java.util.stream.Collectors;
    
    class Ville {
        final int id;
        final double x, y;
    
        Ville(String str) {
            String[] tab = str.split(",");
            id = Integer.parseInt(tab[0]);
            x = Double.parseDouble(tab[1]);
            y = Double.parseDouble(tab[2]);
        }
    }
    
    class Parcours {
        final int a, b;
        final double distance;
    
        Parcours(Ville a, Ville b) {
            this.a = a.id;
            this.b = b.id;
            distance = Point.distance(a.x, a.y, b.x, b.y);
        }
    
        public String toString() {
            return String.format("(%d,%d)=%f", a, b, distance);
        }
    }
    
    public class Test{
    
        public static void main(String[] args) throws Exception {
            List<Ville> villes = Files.lines(Paths.get("C:/test.txt")).skip(1)
                    .map(Ville::new).collect(Collectors.toList());
            List<Parcours> parcours = villes.stream().flatMap(a ->
                    villes.stream().map(b -> new Parcours(a, b)))
                .collect(Collectors.toList());
            System.out.println(parcours);
        }
    }

    Ce qui donne (en considérant les 3 premières villes du fichier)
    [(0,0)=0,000000, (0,1)=5,301141, (0,2)=9,036998,
    (1,0)=5,301141, (1,1)=0,000000, (1,2)=14,021260,
    (2,0)=9,036998, (2,1)=14,02126, (2,2)=0,000000]

    On peut éventuellement supprimer les couples inutiles en rajoutant un
    filter(b -> a.id < b.id)
    pour obtenir :

    [(0,1)=5,301141, (0,2)=9,036998, (1,2)=14,021260]
    0
    1. jj1k Messages postés 32 Statut Membre
       
      Merci
      mais comment je peux récupérer les résultats (les distances) dans un fichier txt ?
      0
      1. KX Messages postés 19031 Statut Modérateur 3 020 > jj1k Messages postés 32 Statut Membre
         
        Une fois que tu as ta List<Parcours> tu en fais ce que tu veux, l'afficher comme je l'ai fait ou l'enregistrer dans un fichier ou tout ce que tu veux...

        try (PrintWriter pw = new PrintWriter("C:/result.txt")) {
            parcours.forEach(pw::println);
        }
        0