Retourner une valeur d'un fichier txt

jj1k Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

comment je peux lire un fichier txt pour retourner le cout de chaque ligne en entrant en paramétre ville origine et ville destination .

affiche(origine,destination)=cout ?

Merci d'avance


A voir également:

4 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

À quoi ressemble ton fichier texte ?
Quelles sont les informations qui t'intéressent sur chaque ligne ?

A priori il faudrait charger le fichier texte une seule fois au démarrage de l'application et ensuite travailler sur des données déjà en mémoire sans avoir à les traiter à nouveau après.
0
jj1k Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
 
Le format de mon fichier est comme ça
id,origin,destination,cost
0,1,1,0
1,1,1252,3
2,1,1267,7
3,1,1730,13
4,1,329,17

Moi je veux faire un distance qui renvoie la valeur

dist( 1,1)= 0
dist (1,1252)=3
dist (1,1267) = 7

comment je peux le faire ?
Merci
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Un exemple en chargeant tes données dans un ensemble trié sur les deux valeurs d'origine et de destination.

import java.io.*;
import java.nio.file.*;
import java.util.*;

public class Parcours implements Comparable<Parcours> {
    public final int id;
    public final int origin;
    public final int destination;
    public final int cost;

    private static final SortedSet<Parcours> ALL_DATAS =
            loadFile("C:/test.txt");

    public Parcours(int id, int origin, int destination, int cost) {
        this.id = id;
        this.origin = origin;
        this.destination = destination;
        this.cost = cost;
    }

    public Parcours(String description) {
        String[] tab = description.split(",");
        id = Integer.parseInt(tab[0]);
        origin = Integer.parseInt(tab[1]);
        destination = Integer.parseInt(tab[2]);
        cost = Integer.parseInt(tab[3]);
    }

    @Override
    public int compareTo(Parcours p) {
        int res = Integer.compare(origin, p.origin);
        if (res != 0)
            return res;
        return Integer.compare(destination, p.destination);
    }

    private static SortedSet<Parcours> loadFile(String fileName) {
        try {
            return Files.lines(Paths.get(fileName))
                .map(Parcours::new)
                .collect(TreeSet::new, (s, p) -> s.add(p), TreeSet::addAll);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    public static Optional<Parcours> find(int origin, int destination) {
        SortedSet<Parcours> r = ALL_DATAS.subSet(
            new Parcours(0, origin, destination, 0),
            new Parcours(0, origin, destination + 1, 0));
        return r.isEmpty() ? Optional.empty() : Optional.of(r.first());
    }

}

Et le code de test :

public static void main(String[] args) {
    System.out.println(Parcours.find(1, 1730).get().cost); // 13
}
0
jj1k Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
 
il s'affiche cette exception


Exception in thread "main" java.lang.ExceptionInInitializerError
at v0.Test.main(Test.java:7)
Caused by: java.lang.NumberFormatException: For input string: "id"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at v0.Parcours.<init>(Parcours.java:24)
at v0.Parcours$$Lambda$2/10754300.apply(Unknown Source)
at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
at java.util.Iterator.forEachRemaining(Unknown Source)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.util.stream.ReferencePipeline.collect(Unknown Source)
at v0.Parcours.loadFile(Parcours.java:42)
at v0.Parcours.<clinit>(Parcours.java:13)
... 1 more
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Il faudrait enlever la première ligne du fichier "id,origin,destination,cost" ou alors rajouter un peu de code pour gérer les cas où les lignes ne contiennent pas que des chiffres.
0
jj1k Messages postés 30 Date d'inscription   Statut Membre Dernière intervention  
 
j'ai enlevé la la premier ligne mais encore une autre exception

Exception in thread "main" java.util.NoSuchElementException: No value present
at java.util.Optional.get(Unknown Source)
at list.Parcours.main(Parcours.java:17)


et c'est ça la ligne 17


System.out.println(Parcours.find(1, 1730).get().cost); // 13
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Ça veut dire qu'il n'a pas trouvé de valeurs avec 1 et 1730 dans le fichier texte, contrairement à ce que ton fichier d'exemple laissait penser...

Pour un code de test un peu plus complet tu peux faire :

public static void main(String[] args) {
    Optional<Parcours> optParcours = Parcours.find(1, 1730);
    if (optParcours.isPresent()) {
        Parcours parcours = optParcours.get();
        System.out.println(parcours.cost);
    } else {
        System.out.println("parcours non trouvé");
    }
}
0