Retourner une valeur d'un fichier txt

Fermé
jj1k Messages postés 30 Date d'inscription jeudi 8 juin 2017 Statut Membre Dernière intervention 3 septembre 2017 - 15 juin 2017 à 18:56
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 16 juin 2017 à 09:56
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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
15 juin 2017 à 20:42
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 jeudi 8 juin 2017 Statut Membre Dernière intervention 3 septembre 2017
15 juin 2017 à 23:44
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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
16 juin 2017 à 00:31
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 jeudi 8 juin 2017 Statut Membre Dernière intervention 3 septembre 2017
16 juin 2017 à 00:54
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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
16 juin 2017 à 08:11
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 jeudi 8 juin 2017 Statut Membre Dernière intervention 3 septembre 2017
16 juin 2017 à 08:26
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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
16 juin 2017 à 09:56
Ç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